program lineup(input,output);

var
    infile : text;
    n,i,j,k,max,nslope : integer;
    x,y,dx,dy,count : array[1..700] of integer;

procedure Swap(var a,b : integer);
var t : integer;
begin
    t := a;
    a := b;
    b := t;
end;

procedure Sort;
var i,j : integer;
begin
    for i := 1 to n-1 do
    begin
        for j := i+1 to n do
        begin
            if y[i] > y[j] then
            begin
                Swap(x[i],x[j]);
                Swap(y[i],y[j]);
            end
            else if y[i] = y[j] then
            begin
                if x[i] > x[j] then
                begin
                    Swap(x[i],x[j]);
                    Swap(y[i],y[j]);
                end;
            end;
        end;
    end;
end;

function GCD(a,b : integer):integer;
var t : integer;
begin
    if a > b then
    begin
        Swap(a,b);
    end;
    while b>0 do
    begin
        t := a;
        a := b;
        b := t mod b;
    end;
    GCD := a;
end;

procedure Reduce(var a,b:integer);
var divisor : integer;
begin
    if a=0 then
    begin
        if b<>0 then
        begin
            if b > 0 then b := 1 else b := -1;
        end;
    end
    else if b=0 then
    begin
        if a > 0 then a := 1 else a := -1;
    end
    else
    begin
        divisor := GCD(abs(a),abs(b));
        a := a div divisor;
        b := b div divisor;
    end;
end;

function Found(var index : integer):boolean;
var result : boolean;
    i : integer;
begin
    result := false;
    i := 1;
    while (not result) and (i<=nslope) do
    begin
        if (dx[i] = dx[nslope+1]) and (dy[i] = dy[nslope+1]) then
        begin
            result := true;
            index := i;
        end;
        inc(i);
    end;
    Found := result;
end;

begin
    assign(infile,'lineup.in');
    reset(infile);

    while not eof(infile) do
    begin
        readln(infile,n);
        for i := 1 to n do
        begin
            readln(infile,x[i],y[i]);
        end;
        Sort;
        i := 1;
        max := 2;
        while i<n-max do
        begin
            nslope := 0;
            for j := i+1 to n do
            begin
                dx[nslope+1] := x[i]-x[j];
                dy[nslope+1] := y[i]-y[j];
                Reduce(dy[nslope+1],dx[nslope+1]);
                if not Found(k) then
                begin
                    inc(nslope);
                    count[nslope] := 1;
                end
                else
                begin
                    inc(count[k]);
                    if 1+count[k] > max then max := 1+count[k];
                end;
            end;
            inc(i);
        end;
        writeln(max:1);
    end;

    close(infile);
end.

