#include <bits/stdc++.h>
struct fpoint {
  int x, y;
  void pme() { printf("point: %d %d\n", x, y); }
  void inp() { scanf("%d%d", &x, &y); }
};
fpoint pts[8];
int choose[8], choosep[2][4], choosepp[2];
int ordr[6][4] = {
    {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 2, 1, 3},
    {0, 2, 3, 1}, {0, 3, 1, 2}, {0, 3, 2, 1},
};
struct farrow {
  int x, y;
  void pme() { printf("arrow: %d %d\n", x, y); }
  void mkarrow(const int p0, const int p1) {
    x = pts[p0].x - pts[p1].x;
    y = pts[p0].y - pts[p1].y;
  }
  bool is0() {
    if (x == 0 && y == 0) return true;
    return false;
  }
  int len() { return x * x + y * y; }
};
bool px(farrow a0, farrow a1) {
  if (a0.x * a1.y - a1.x * a0.y == 0) {
    return true;
  }
  return false;
}
bool eq(farrow a0, farrow a1) {
  if (a0.len() == a1.len()) return true;
  return false;
}
int dotmul(farrow a0, farrow a1) { return a0.x * a1.x + a0.y * a1.y; }
bool cz(farrow a0, farrow a1) {
  if (dotmul(a0, a1) == 0) return true;
  return false;
}
bool isrectin(struct farrow *a) {
  if (px(a[0], a[1]) && px(a[2], a[3]) && cz(a[0], a[2]) &&
          !(a[0].is0() || a[2].is0()) ||
      px(a[0], a[2]) && px(a[1], a[3]) && cz(a[0], a[1]) &&
          !(a[0].is0() || a[1].is0()))
    return true;
  return false;
}
bool isrect(int *plst) {
  farrow alst[4];
  for (int xho = 0; xho < 6; xho++) {
    for (int xh = 0; xh < 4; xh++)
      alst[xh].mkarrow(plst[ordr[xho][xh]], plst[ordr[xho][(xh + 1) % 4]]);
    if (isrectin(alst)) return true;
  }
  return false;
}
bool issqrin(struct farrow *a) {
  if (px(a[0], a[1]) && px(a[2], a[3]) && eq(a[0], a[2]) && cz(a[0], a[2]) &&
          !(a[0].is0() || a[1].is0()) ||
      px(a[0], a[2]) && px(a[1], a[3]) && eq(a[0], a[1]) && cz(a[0], a[1]) &&
          !(a[0].is0() || a[2].is0()))
    return true;
  return false;
}
bool issqr(int *plst) {
  farrow alst[4];
  for (int xho = 0; xho < 6; xho++) {
    for (int xh = 0; xh < 4; xh++)
      alst[xh].mkarrow(plst[ordr[xho][xh]], plst[ordr[xho][(xh + 1) % 4]]);
    if (issqrin(alst)) return true;
  }
  return false;
}
int dg(int dep, int stt) {
  if (dep == 4) {
    choosepp[0] = (choosepp[1] = 0);
    for (int xh = 0; xh < 8; xh++)
      choosep[choose[xh]][choosepp[choose[xh]]++] = xh;
    if (issqr(choosep[0]) && isrect(choosep[1])) return 1;
    return 0;
  } else {
    for (int xh = stt; xh < 8; xh++) {
      choose[xh] = 1;
      if (dg(dep + 1, xh + 1) == 1) return 1;
      choose[xh] = 0;
    }
  }
  return 0;
}
int main() {
  for (int xh = 0; xh < 8; xh++) pts[xh].inp();
  if (dg(0, 0) == 1) {
    printf("YES\n");
    for (int xh = 0; xh < 2; xh++) {
      for (int xh0 = 0; xh0 < 4; xh0++) printf("%d ", choosep[xh][xh0] + 1);
      printf("\n");
    }
  } else {
    printf("NO\n");
  }
  return 0;
}
