#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
void getpoint(complex<long double> &p) {
  long double a, b;
  cin >> a >> b, p = {a, b};
}
bool chk(complex<long double> a, complex<long double> b, complex<long double> c,
         complex<long double> d) {
  long double ang = arg((b - a)) + acos(-1) / 2;
  if (ang > acos(-1) + 1e-10) ang -= 2 * acos(-1);
  bool ret = (fabs(arg((c - b)) - ang) <= 1e-10);
  ang += acos(-1) / 2;
  if (ang > acos(-1) + 1e-10) ang -= 2 * acos(-1);
  ret &= (fabs(arg((d - c)) - ang) <= 1e-10);
  ang += acos(-1) / 2;
  if (ang > acos(-1) + 1e-10) ang -= 2 * acos(-1);
  ret &= (fabs(arg((a - d)) - ang) <= 1e-10);
  return ret;
}
bool square(complex<long double> a, complex<long double> b,
            complex<long double> c, complex<long double> d) {
  bool ret = (fabs(abs((b - a)) - abs((c - b))) <= 1e-10 &&
              fabs(abs((b - a)) - abs((d - c))) <= 1e-10 &&
              fabs(abs((b - a)) - abs((a - d))) <= 1e-10);
  return (ret & chk(a, b, c, d));
}
bool rectangle(complex<long double> a, complex<long double> b,
               complex<long double> c, complex<long double> d) {
  bool ret = (fabs(abs((b - a)) - abs((d - c))) <= 1e-10 &&
              fabs(abs((c - b)) - abs((a - d))) <= 1e-10);
  return (ret & chk(a, b, c, d));
}
const int N = 8;
vector<complex<long double> > v;
int pos[N];
complex<long double> p;
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cout << fixed << setprecision(2);
  for (int i = 0; i < N; i++) {
    getpoint(p);
    v.push_back(p);
    pos[i] = i;
  }
  do {
    if (square(v[pos[0]], v[pos[1]], v[pos[2]], v[pos[3]]) &&
        rectangle(v[pos[4]], v[pos[5]], v[pos[6]], v[pos[7]])) {
      cout << "YES\n";
      for (int i = 0; i < N / 2; i++) cout << pos[i] + 1 << ' ';
      cout << '\n';
      for (int i = N / 2; i < N; i++) cout << pos[i] + 1 << ' ';
      return 0;
    }
  } while (next_permutation(pos, pos + N));
  cout << "NO\n";
  return 0;
}
