#include <bits/stdc++.h>
using namespace std;
int szs[100100];
int sza[100100];
int szo[100100];
int numd;
int numa;
int numo;
int totb;
int top;
struct nodeb {
  bool used;
  int next;
  int v;
};
nodeb szb[200100];
struct noded {
  int ind;
};
noded szd[100100];
void adde(int from, int to) {
  totb++;
  szb[totb].v = to;
  szb[totb].next = szd[from].ind;
  szd[from].ind = totb;
  return;
}
void dfs(int x) {
  int f1;
  szs[++top] = x;
  for (f1 = szd[x].ind; f1 != 0; f1 = szb[f1].next)
    if (szb[f1].used == false) {
      szb[f1].used = true;
      dfs(szb[f1].v);
      break;
    }
  return;
}
void cal(int x) {
  int f1;
  for (szs[++top] = x; top > 0;) {
    for (f1 = szd[szs[top]].ind; f1 != 0; f1 = szb[f1].next)
      if (szb[f1].used == false) break;
    if (f1 == 0)
      sza[++numa] = szs[top--];
    else
      dfs(szs[top--]);
  }
  return;
}
int main() {
  int f1;
  int f2;
  scanf("%d", &numd);
  if (numd == 2) {
    printf("0 1 0\n");
    return 0;
  }
  if (numd & 1) {
    printf("%d\n", -1);
    return 0;
  }
  numd >>= 1;
  for (f1 = 0; f1 < numd; f1++) {
    adde(f1, (((f1) << 1) % numd));
    adde(f1, ((((f1) << 1) | 1) % numd));
  }
  cal(0);
  for (f1 = numa; f1 > 1; f1--)
    if (sza[f1 - 1] == ((((sza[f1]) << 1) | 1) % numd))
      szo[++numo] = (sza[f1] << 1) | 1;
    else
      szo[++numo] = sza[f1] << 1;
  for (f1 = 1; f1 <= numo; f1++)
    if (szo[f1] == 0) break;
  for (f2 = f1; f2 <= f1 + numo; f2++) printf("%d ", szo[(f2 - 1) % numo + 1]);
  return 0;
}
