import Control.Monad
import Control.Applicative
import Debug.Trace

data Point = Point (Double, Double) deriving (Show)
add (Point (x1, y1)) (Point (x2, y2)) = Point (x1 + x2, y1 + y2)
sub (Point (x1, y1)) (Point (x2, y2)) = Point (x1 - x2, y1 - y2)
mul (Point (x, y)) s = Point (x * s, y * s)
det (Point (x1, y1)) (Point (x2, y2)) = x1 * y2 - y1 * x2
nrm (Point (x, y)) = Point (x / n, y / n) where n = sqrt $ (x * x + y * y)
dist (Point (x1, y1)) (Point (x2, y2)) = sqrt (dx * dx + dy * dy) where
    dx = x1 - x2
    dy = y1 - y2

getX (Point (x, _)) = x
getY (Point (_, y)) = y

parsePoint :: String -> Point
parsePoint str =
    let [x, y] = map read $ words str
    in Point (x, y)

calcCenter :: Point -> Point -> (Point, Point)
calcCenter a b =
    let m = (a `add` b) `mul` 0.5
        d = sqrt (1.0 - (dist a m))
        e = a `sub` b
        n = nrm $ Point (negate $ getY e, getX e)
        c1 = m `add` (n `mul` d)
        c2 = m `sub` (n `mul` d)
    in (c1, c2)

solve' :: [Point] -> Int
solve' pts =
    let cs = [ calcCenter a b | a <- pts, b <- pts ]
        inside p q = (dist p q) <= 1.0
        countIn c = length $ filter (\p -> inside c p) pts
        m1 = maximum $ map (countIn . fst) cs
        m2 = maximum $ map (countIn . snd) cs
    in (max m1 m2)

solve :: [String] -> [Int]
solve []   = []
solve cont =
    let n           = read (head cont) :: Int
        (crds, rst) = splitAt n (tail cont)
        pts         = map parsePoint crds
    in if n == 0 then []
                 else (solve' pts) : solve rst

main :: IO ()
main = do
    contents <- getContents
    mapM_ print $ solve $ lines contents