#include <bits/stdc++.h>
using namespace std;
int A92[] = {1, 1,  -1, -1, -1, 1,  -1, -1, -1, 1,  -1, 1,
             1, -1, 1,  -1, -1, -1, 1,  -1, -1, -1, 1};
int B92[] = {1, -1, 1, 1,  -1, 1, 1, -1, -1, 1, 1, 1,
             1, 1,  1, -1, -1, 1, 1, -1, 1,  1, -1};
int C92[] = {1, 1,  1, -1, -1, -1, 1,  1,  -1, 1, -1, 1,
             1, -1, 1, -1, 1,  1,  -1, -1, -1, 1, 1};
int D92[] = {1,  1,  1,  -1, 1,  1, 1, -1, 1,  -1, -1, -1,
             -1, -1, -1, 1,  -1, 1, 1, 1,  -1, 1,  1};
set<int> paley1, paley2;
struct MAT {
  vector<vector<int> > a;
  int n;
  MAT(int _n) {
    n = _n;
    a.resize(n);
    for (int i = 0; i < n; i++) {
      a[i].resize(n, 0);
    }
  }
};
MAT construct_circulant_symmetric_matrix(int first_row[], int n) {
  MAT R(n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      R.a[i][j] = first_row[(n + j - i) % n];
    }
  }
  return R;
}
MAT get_negative(MAT A) {
  int n = A.n;
  MAT B(n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      B.a[i][j] = -A.a[i][j];
    }
  }
  return B;
}
MAT join_mat(MAT A, MAT B, MAT C, MAT D, int n) {
  MAT R(2 * n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      R.a[i][j] = A.a[i][j];
      R.a[i][n + j] = B.a[i][j];
      R.a[n + i][j] = C.a[i][j];
      R.a[n + i][n + j] = D.a[i][j];
    }
  }
  return R;
}
MAT construct_williamson_92() {
  MAT A = construct_circulant_symmetric_matrix(A92, 23);
  MAT B = construct_circulant_symmetric_matrix(B92, 23);
  MAT C = construct_circulant_symmetric_matrix(C92, 23);
  MAT D = construct_circulant_symmetric_matrix(D92, 23);
  MAT nB = get_negative(B);
  MAT nC = get_negative(C);
  MAT X = join_mat(A, B, nB, A, 23);
  MAT Y = join_mat(C, D, D, nC, 23);
  MAT nY = get_negative(Y);
  MAT R = join_mat(X, Y, nY, X, 46);
  return R;
}
bool has_solution(int n) { return n == 1 || n == 2 || (n % 4 == 0); }
vector<int> get_prime_residues(int n) {
  vector<int> is_square(n, -1);
  is_square[0] = 0;
  for (int i = 1; i < n; i++) {
    int res = (i * i) % n;
    if (res < 0) res += n;
    is_square[res] = 1;
  }
  return is_square;
}
vector<int> get_square_residues(int n) {
  int a1, a0, p;
  if (n == 25)
    a1 = -4, a0 = -2, p = 5;
  else
    a1 = -6, a0 = -3, p = 7;
  vector<int> is_square(n, -1);
  is_square[0] = 0;
  for (int i = 0; i < p; i++) {
    for (int j = 0; j < p; j++) {
      if (i + j == 0) continue;
      int res1 = (a1 * i * i + 2 * i * j) % p;
      int res2 = (a0 * i * i + j * j) % p;
      if (res1 < 0) res1 += p;
      if (res2 < 0) res2 += p;
      is_square[p * res1 + res2] = 1;
    }
  }
  return is_square;
}
MAT expand_paley(MAT A, int n) {
  MAT R(2 * n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (A.a[i][j] == 0) {
        R.a[2 * i][2 * j] = 1;
        R.a[2 * i][2 * j + 1] = -1;
        R.a[2 * i + 1][2 * j] = -1;
        R.a[2 * i + 1][2 * j + 1] = -1;
      } else if (A.a[i][j] == 1) {
        R.a[2 * i][2 * j] = 1;
        R.a[2 * i][2 * j + 1] = 1;
        R.a[2 * i + 1][2 * j] = 1;
        R.a[2 * i + 1][2 * j + 1] = -1;
      } else {
        R.a[2 * i][2 * j] = -1;
        R.a[2 * i][2 * j + 1] = -1;
        R.a[2 * i + 1][2 * j] = -1;
        R.a[2 * i + 1][2 * j + 1] = 1;
      }
    }
  }
  return R;
}
MAT get_solution(int n) {
  if (n == 1) {
    MAT ret(1);
    ret.a[0][0] = 1;
    return ret;
  } else if (n == 2) {
    MAT ret(2);
    ret.a[0][0] = ret.a[0][1] = ret.a[1][0] = 1;
    ret.a[1][1] = -1;
    return ret;
  } else if (n == 92) {
    return construct_williamson_92();
  } else if (paley1.find(n) != paley1.end()) {
    int q = n - 1;
    vector<int> is_square = get_prime_residues(q);
    MAT R(n);
    R.a[0][0] = 1;
    for (int i = 1; i < q + 1; i++) {
      R.a[0][i] = 1;
      R.a[i][0] = -1;
    }
    for (int i = 0; i < q; i++) {
      for (int j = 0; j < q; j++) {
        if (i == j)
          R.a[i + 1][j + 1] = 1;
        else
          R.a[i + 1][j + 1] = is_square[(q + i - j) % q];
      }
    }
    return R;
  } else if (paley2.find(n) != paley2.end()) {
    int q = (n / 2) - 1;
    MAT R2(q + 1);
    for (int i = 1; i < q + 1; i++) {
      R2.a[0][i] = 1;
      R2.a[i][0] = 1;
    }
    if (n == 52 || n == 100) {
      vector<int> is_square = get_square_residues(q);
      int q_root;
      if (n == 52)
        q_root = 5;
      else
        q_root = 7;
      for (int i = 0; i < q; i++) {
        for (int j = 0; j < q; j++) {
          int i1 = i / q_root, j1 = j / q_root;
          int block = (i1 - j1 + q_root) % q_root;
          int ni = i - i1 * q_root, nj = j - j1 * q_root;
          int inx = q_root * block + (ni - nj + q_root) % q_root;
          R2.a[i + 1][j + 1] = is_square[inx];
          if (i % q_root >= j % q_root && i >= j) cout << 0 << "";
          if (i % q_root < j % q_root && i >= j) cout << 1 << "";
          if (i % q_root >= j % q_root && i < j) cout << 1 << "";
          if (i % q_root < j % q_root && i < j) cout << 2 << "";
        }
        cout << endl;
      }
      cout << endl;
    } else {
      vector<int> is_square = get_prime_residues(q);
      for (int i = 0; i < q; i++) {
        for (int j = 0; j < q; j++) {
          R2.a[i + 1][j + 1] = is_square[(q + i - j) % q];
        }
      }
    }
    MAT R = expand_paley(R2, q + 1);
    return R;
  }
  MAT A = get_solution(n / 2);
  MAT nA = get_negative(A);
  MAT R = join_mat(A, A, A, nA, n / 2);
  return R;
}
void construct_paley_sets() {
  paley1.insert(4), paley1.insert(8), paley1.insert(12), paley1.insert(20),
      paley1.insert(24);
  paley1.insert(32), paley1.insert(44), paley1.insert(48), paley1.insert(60);
  paley1.insert(68), paley1.insert(72), paley1.insert(80), paley1.insert(84);
  paley2.insert(28), paley2.insert(36), paley2.insert(52);
  paley2.insert(76), paley2.insert(100);
}
int main() {
  construct_paley_sets();
  int t;
  t = 1;
  while (t--) {
    int n;
    cin >> n;
    n = 1 << n;
    if (!has_solution(n)) {
    } else {
      MAT ans = get_solution(n);
      int len = ans.n;
      for (int i = 0; i < len; i++) {
        for (int j = 0; j < len; j++) {
          if (ans.a[i][j] == 1) cout << "+";
          if (ans.a[i][j] == -1) cout << "*";
        }
        cout << endl;
      }
      cout << endl;
    }
  }
}
