#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <cassert>
#include <complex>
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <functional>
#include <algorithm>
#include <stack>
#include <numeric>
#include <set>
#include <chrono>
#include <random>

#define all(X) (X).begin(), (X).end()
#define int long long
#define m_p make_pair
#define endl '\n'
using namespace std;
mt19937_64 rnd(std::chrono::system_clock::now().time_since_epoch().count());

const int MAXN = 1e6 + 100, mod = 1e9 + 7;

int gcd(int a, int b) {
	if (b == 0)
		return a;
	else
		return gcd(b, a % b);
}

void extgcd(int a, int b, int &x, int &y) {
	if (b == 0) {
		x = 1; y = 0;
		return;
	}
	else {
		extgcd(b, a % b, x, y);
		int temp = y;
		y = x - (a / b) * y;
		x = temp;
	}
}

int inv(int a, int mod) {
	int x, y;
	extgcd(a, mod, x, y);
	x = (x % mod + mod) % mod;
	return x;
}

int f[MAXN];

int c(int n, int k) {
	if (n < 0 || n < 0 || n - k < 0)
		return 0;
	return (f[n] * inv(f[n - k] * f[k], mod)) % mod;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	int n; cin >> n;
	f[0] = 1;
	for (int i = 1; i <= n; i++)
		f[i] = (f[i - 1] * i) % mod;

	int ans = 0;
	for (int k = 0; k <= n; k++) {
		if ((n - k) % 2)
			continue;
		ans += (f[n - k] * ((2 * c(n - k - 1, k) + 4 * c(n - k - 1, k - 1)) % mod)) % mod;
		ans %= mod;
	}
	cout << ans;
	return 0;
}