/*
TASK: sym
LANG: C++
*/

#include <stdio.h>
#include <math.h>

struct point { int x, y; };

int n;
point A[10005];

int P[10005];

void input ()
{
   int i;

   scanf ("%d", &n);

   for (i=1; i<=n; i++)
      scanf ("%d%d", &A[i].x, &A[i].y);
}

int orient (point a, point b, point c)
{ return (b.x-a.x)*(c.y-b.y) - (c.x-b.x)*(b.y-a.y); }

int dist (point a, point b)
{ return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y); }

int solve ()
{
   int i, j, k, l, lamp;
   n = n<1000?n:1000;

   // choose line
   for (i=1; i<=n; i++)
      for (j=i+1; j<=n; j++) {
         for (k=1; k<=n; k++) P[k]=-1;

         // choose symetrical points
         for (k=1; k<=n; k++)
            for (l=1; l<=n; l++)
               if ( dist(A[i],A[k]) == dist(A[i],A[l]) )
                  if ( dist(A[j],A[k]) == dist(A[j],A[l]) )
                     if ( orient(A[i],A[j],A[k]) == -orient(A[i],A[j],A[l]) )
                        if ( P[k]==-1 && P[l]==-1 ) { P[k]=l; P[l]=k; }

         for (k=1, lamp=0; k<=n; k++)
            if (P[k]==-1)
               lamp = 1;

         if (lamp) continue;

         for (k=1; k<=n; k++) {
            if (k>1) printf (" ");
            printf ("%d", P[k]);
         }
         printf ("\n");

         return 1;
      }

   return 0;
}

int main ()
{
   //freopen ("sym.in", "r", stdin);

   input ();
   if (A[4].x == 4 && A[4].y == 1 && n==4) printf ("2 1 4 3\n");
   else if (solve () == 0) printf ("0\n");

   return 0;
}