// Slower C++ solution:
#include <iostream>

#include <algorithm>

#include <numeric>

#include <cmath>

#include <string>

#include <vector>

#include <queue>

#include <deque>

#include <stack>

#include <map>

#include <set>

#include <unordered_map>

#include <unordered_set>

#include <iomanip> // cout<<setprecision(n)

#include <functional> // std::function<void(long long)>

using namespace std;

#define All(v) (v).begin(),(v).end()

const long long mod = 1000000007;

const long long inf = mod*mod;

const int MAXS = 500000;

const double EPS=1e-10;

const double INF=1e+10;

const double PI=acos(-1.0);

long long fact[MAXS];

void makef() {

    fact[0] = 1;

    for (long long i = 1; i < MAXS-1; i++) {

        fact[i] = fact[i - 1] * i;

        fact[i] %= mod;

    }

}



signed main(){

    makef();

    long long n,m;

    cin>>n>>m;

    if(abs(n-m)>1){

        cout<<0<<endl;

        return 0;

    }

    long long res = fact[n];

    res *= fact[m];

    res %= mod;

    if(n==m){

        res*=2;

        res%=mod;

    }

    cout<<res<<endl;



    



}

// Faster C++ solution for the same problem (measured speedup: 2.1575887806604106x):
#include <iostream>

#include <algorithm>

#include <numeric>

#include <cmath>

#include <string>

#include <vector>

#include <queue>

#include <deque>

#include <stack>

#include <map>

#include <set>

#include <unordered_map>

#include <unordered_set>

#include <iomanip>

#include <functional>

using namespace std;

#define int long long

#define All(v) (v).begin(),(v).end()

int dy[8] = {-1,0,1,0,-1,1,1,-1};

int dx[8] = {0,1,0,-1,1,1,-1,-1};

const int mod = 1000000007;

const int inf = mod*mod;

const int d5 = 100100;



template <int mod>

struct ModInt

{

    int x;



    ModInt() : x(0) {}

    ModInt(long long y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}



    ModInt &operator+=(const ModInt &p)

    {

        if ((x += p.x) >= mod)

            x -= mod;

        return *this;

    }

    ModInt &operator-=(const ModInt &p)

    {

        if ((x += mod - p.x) >= mod)

            x -= mod;

        return *this;

    }

    ModInt &operator*=(const ModInt &p)

    {

        x = (int)(1LL * x * p.x % mod);

        return *this;

    }

    ModInt &operator/=(const ModInt &p)

    {

        *this *= p.inverse();

        return *this;

    }



    ModInt operator-() const { return ModInt(-x); }

    ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }

    ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }

    ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }

    ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }



    bool operator==(const ModInt &p) const { return x == p.x; }

    bool operator!=(const ModInt &p) const { return x != p.x; }



    ModInt inverse() const

    {

        int a = x, b = mod, u = 1, v = 0, t;

        while (b > 0)

        {

            t = a / b;

            a -= t * b;

            swap(a, b);

            u -= t * v;

            swap(u, v);

        }

        return ModInt(u);

    }



    ModInt pow(int e)

    {

        long long a = 1, p = x;

        while (e > 0)

        {

            if (e % 2 == 0)

            {

                p = (p * p) % mod;

                e /= 2;

            }

            else

            {

                a = (a * p) % mod;

                e--;

            }

        }

        return ModInt(a);

    }



    friend ostream &operator<<(ostream &os, const ModInt<mod> &p)

    {

        return os << p.x;

    }

    friend istream &operator>>(istream &is, ModInt<mod> &a)

    {

        long long x;

        is >> x;

        a = ModInt<mod>(x);

        return (is);

    }

};



using modint = ModInt<mod>;

modint f[d5];



void makef()

{

    f[0] = 1;

    for (int i = 1; i < d5; i++)

        f[i] = f[i - 1] * i;

}



modint nCr(int n, int r)

{

    if (n < r || r < 0)

        return 0;

    return f[n] / (f[r] * f[n - r]);

}

signed main(){

    ios::sync_with_stdio(false);

    cin.tie(0);

    makef();

    int a, b;

    cin>>a>>b;

    if(abs(a-b)>1){

        cout << 0 << endl;

    }

    else{

        modint res = 1;

        res *= f[min(a,b)];

        res *= f[max(a,b)];

        if(a==b)

            res *= 2;

        cout << res << endl;

    }

}