#include <bits/stdc++.h>
using namespace std;
void loadData(void);
bool proc(void);
void printRes(bool);
typedef struct Point {
  int x, y;
  int index;
} point;
int getOneNum(int d[8]);
void addOne(int d[8]);
void getCandidatePoint(int d[8], const int &value, point cp[4]);
bool formSquare(point pp[4]);
bool formRectangle(point pp[4]);
bool formSquareByOrder(point pp[4]);
bool formRectangleByOrder(point pp[4]);
bool parall(const point &a, const point &b, const point &c, const point &d);
bool vertical(const point &a, const point &b, const point &c, const point &d);
int getLength(const point &a, const point &b);
void testSquare(point pp[4]);
void testRectangle(point pp[4]);
void testSquareByOrder(point pp[4]);
void testRectangleByOrder(point pp[4]);
void test_parall(const point &a, const point &b, const point &c,
                 const point &d);
void test_vertical(const point &a, const point &b, const point &c,
                   const point &d);
int order[24][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}, {1, 0, 2, 3}, {1, 0, 3, 2},
                    {1, 2, 0, 3}, {1, 2, 3, 0}, {1, 3, 0, 2}, {1, 3, 2, 0},
                    {2, 0, 1, 3}, {2, 0, 3, 1}, {2, 1, 0, 3}, {2, 1, 3, 0},
                    {2, 3, 0, 1}, {2, 3, 1, 0}, {3, 0, 1, 2}, {3, 0, 2, 1},
                    {3, 1, 0, 2}, {3, 1, 2, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}};
point p[8];
point cp1[4], cp2[4];
bool lyb_debug = false;
int main(int argc, char **argv) {
  loadData();
  printRes(proc());
  return 0;
}
bool vertical(const point &a, const point &b, const point &c, const point &d) {
  return (b.y - a.y) * (d.y - c.y) + (b.x - a.x) * (d.x - c.x) == 0;
}
bool parall(const point &a, const point &b, const point &c, const point &d) {
  return (b.y - a.y) * (d.x - c.x) == (d.y - c.y) * (b.x - a.x);
}
int getLength(const point &a, const point &b) {
  return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
void test_parall(const point &a, const point &b, const point &c,
                 const point &d) {
  printf("(%d-%d)*(%d-%d)=%d\n", b.y, a.y, d.x, c.x, (b.y - a.y) * (d.x - c.x));
  printf("(%d-%d)*(%d-%d)=%d\n", d.y, c.y, b.x, a.x, (d.y - c.y) * (b.x - a.x));
  if (parall(a, b, c, d))
    printf("parall!\n");
  else
    printf("unparall!\n");
  return;
}
void test_vertical(const point &a, const point &b, const point &c,
                   const point &d) {
  printf("(%d-%d)*(%d-%d)=%d\n", b.y, a.y, d.y, c.y, (b.y - a.y) * (d.y - c.y));
  printf("(%d-%d)*(%d-%d)=%d\n", b.x, a.x, d.x, c.x, (b.x - a.x) * (d.x - c.x));
  if (vertical(a, b, c, d))
    printf("vertical!\n");
  else
    printf("unvertical!\n");
  return;
}
void testSquare(point pp[4]) {
  printf("test square\n");
  printf("the point is ");
  for (int i = 0; i < 4; i++) printf("(%d,%d) ", pp[i].x, pp[i].y);
  printf("\n");
  point porder[4];
  for (int i = 0; i < 24; i++) {
    for (int j = 0; j < 4; j++) {
      porder[j] = pp[order[i][j]];
    }
    if (formSquareByOrder(porder)) {
      testSquareByOrder(porder);
      return;
    }
  }
  return;
}
void testRectangle(point pp[4]) {
  printf("test rectangle\n");
  printf("the point is ");
  for (int i = 0; i < 4; i++) printf("(%d,%d) ", pp[i].x, pp[i].y);
  printf("\n");
  point porder[4];
  for (int i = 0; i < 24; i++) {
    for (int j = 0; j < 4; j++) {
      porder[j] = pp[order[i][j]];
    }
    if (formRectangleByOrder(porder)) {
      testRectangleByOrder(porder);
      return;
    }
  }
  return;
}
void testSquareByOrder(point pp[4]) {
  printf("test square by order!\n");
  printf("the point is ");
  for (int i = 0; i < 4; i++) printf("(%d,%d) ", pp[i].x, pp[i].y);
  printf("\n");
  printf("test parall of [0],[1] - [3],[2]:\n");
  test_parall(pp[0], pp[1], pp[3], pp[2]);
  printf("test parall of [0],[3] - [1],[2]:\n");
  test_parall(pp[0], pp[3], pp[1], pp[2]);
  printf("test vertical of [0],[1] - [0],[3]:\n");
  test_vertical(pp[0], pp[1], pp[0], pp[3]);
  printf("test vertical of [1],[2] - [2],[3]:\n");
  test_vertical(pp[1], pp[2], pp[2], pp[3]);
  return;
}
void testRectangleByOrder(point pp[4]) {
  printf("test rectangle by order!\n");
  printf("the point is ");
  for (int i = 0; i < 4; i++) printf("(%d,%d) ", pp[i].x, pp[i].y);
  printf("\n");
  printf("test parall of [0],[1] - [3],[2]:\n");
  test_parall(pp[0], pp[1], pp[3], pp[2]);
  printf("test parall of [0],[3] - [1],[2]:\n");
  test_parall(pp[0], pp[3], pp[1], pp[2]);
  printf("test vertical of [0],[1] - [0],[3]:\n");
  test_vertical(pp[0], pp[1], pp[0], pp[3]);
  printf("test vertical of [1],[2] - [2],[3]:\n");
  test_vertical(pp[1], pp[2], pp[2], pp[3]);
  return;
}
bool formSquareByOrder(point pp[4]) {
  return formRectangleByOrder(pp) &&
         getLength(pp[0], pp[1]) == getLength(pp[0], pp[3]);
}
bool formRectangleByOrder(point pp[4]) {
  return parall(pp[0], pp[1], pp[3], pp[2]) &&
         parall(pp[0], pp[3], pp[1], pp[2]) &&
         vertical(pp[0], pp[1], pp[0], pp[3]) &&
         vertical(pp[1], pp[2], pp[2], pp[3]) &&
         getLength(pp[0], pp[1]) == getLength(pp[2], pp[3]) &&
         getLength(pp[0], pp[3]) == getLength(pp[1], pp[2]) &&
         getLength(pp[0], pp[1]) != 0 && getLength(pp[0], pp[3]) != 0;
}
bool formSquare(point pp[4]) {
  point porder[4];
  for (int i = 0; i < 24; i++) {
    for (int j = 0; j < 4; j++) {
      porder[j] = pp[order[i][j]];
    }
    if (formSquareByOrder(porder)) return true;
  }
  return false;
}
bool formRectangle(point pp[4]) {
  point porder[4];
  for (int i = 0; i < 24; i++) {
    for (int j = 0; j < 4; j++) {
      porder[j] = pp[order[i][j]];
    }
    if (formRectangleByOrder(porder)) return true;
  }
  return false;
}
void getCandidatePoint(int d[8], const int &value, point cp[4]) {
  int index = 0;
  for (int i = 0; i < 8; i++)
    if (d[i] == value) cp[index++] = p[i];
  return;
}
void addOne(int d[8]) {
  for (int i = 7; i >= 0; i--) {
    if (d[i] == 1) {
      d[i] = 0;
    } else {
      d[i] = 1;
      break;
    }
  }
  return;
}
int getOneNum(int d[8]) {
  int res = 0;
  for (int i = 0; i < 8; i++)
    if (d[i] == 1) res++;
  return res;
}
bool proc(void) {
  int decimal[8];
  memset(decimal, 0, sizeof(decimal));
  while (true) {
    int onenum = getOneNum(decimal);
    if (onenum == 8) break;
    if (onenum == 4) {
      getCandidatePoint(decimal, 1, cp1);
      getCandidatePoint(decimal, 0, cp2);
      if (formSquare(cp1) && formRectangle(cp2)) {
        if (lyb_debug) {
          testSquare(cp1);
          testRectangle(cp2);
        }
        return true;
      }
    }
    addOne(decimal);
  }
  return false;
}
void loadData(void) {
  for (int i = 1; i <= 8; i++) {
    scanf("%d%d", &p[i - 1].x, &p[i - 1].y);
    p[i - 1].index = i;
  }
  return;
}
void printRes(bool res) {
  printf("%s\n", res ? "YES" : "NO");
  if (res) {
    for (int i = 0; i < 4; i++)
      printf("%d%c", cp1[i].index, i == 3 ? '\n' : ' ');
    for (int i = 0; i < 4; i++)
      printf("%d%c", cp2[i].index, i == 3 ? '\n' : ' ');
  }
  return;
}
