#include <bits/stdc++.h>

using namespace std;

typedef long long  ll;

const double EPS=1e-9;
const double INF=1e10;
const double PI = M_PI;
// ?????¢?????????
struct Point{
    Point(double x, double y):x(x) ,y(y){}
    Point(){}
    double x,y;
};
Point operator+(const Point &a, const Point &b){
    return Point(a.x + b.x, a.y + b.y);
}
Point operator-(const Point &a, const Point &b){
    return Point(a.x - b.x, a.y - b.y);
}
Point operator*(const Point &a, const double b){
    return Point(a.x * b, a.y * b);
}
Point operator/(const Point &a, const double b){
    return Point(a.x / b, a.y / b);
}
double cross(const Point &a, const Point &b){
    return a.x * b.y - a.y * b.x;
}
double dot(const Point &a, const Point &b){
    return a.x * b.x + a.y * b.y;
}
bool operator<(const Point &a, const Point &b){
    return make_pair(a.x, a.y) < make_pair(b.x, b.y);
}
double norm(const Point &a){
    return dot(a, a);
}
double abs(const Point &a){
    return sqrt(norm(a));
}
Point rotate90(const Point &a){
    return Point(-a.y, a.x);
}
struct Line:vector<Point>{
    Line(Point a = Point(0,0), Point b = Point(0,0)){
        this->push_back(a);
        this->push_back(b);
    }
};
struct Circle: Point{
    double r;
    Circle(Point p = Point(0,0), double r=0):Point(p),r(r){}
};
vector<Point> tangentCP(const Circle &c, const Point &p){
    double x = norm(p - c);
    double d = x - c.r * c.r;
    if(d < -EPS) return vector<Point>();
    d = max(d, 0.0);
    Point q1 = (p - c) * (c.r * c.r / x);
    Point q2 = rotate90((p - c) * (-c.r * sqrt(d) / x));
    vector<Point> ret;
    ret.push_back(c + q1 - q2);
    ret.push_back(c + q1 + q2);
    return ret;
}
vector<Line> tangentCC(const Circle &a, const Circle &b){
    vector<Line> list;
    if(abs(a.r - b.r) < EPS){ // 2 ?????????????????????
        Point dir = b - a;
        dir = rotate90(dir * (a.r / abs(dir)));
        list.push_back(Line(a + dir, b + dir));
        list.push_back(Line(a - dir, b - dir));
    } else {
        Point p = (a * (-b.r)) + (b * a.r);
        p = p * (1 / (a.r - b.r));
        vector<Point> ps = tangentCP(a, p);
        vector<Point> qs = tangentCP(b, p);
        for (int i = 0; i < min(ps.size(), qs.size()); ++i)
            list.push_back(Line(ps[i],qs[i]));
    }
    Point p = (a * b.r) + (b * a.r);
    p = p * (1 / (a.r + b.r));
    vector<Point> ps = tangentCP(a, p);
    vector<Point> qs = tangentCP(b, p);
    for (int i = 0; i < min(ps.size(), qs.size()); ++i)
        list.push_back(Line(ps[i],qs[i]));
    return list;
}

Point projection(const Line &l, const Point &p){
    double t = dot(p - l[0], l[1] - l[0]) / norm(l[0] - l[1]);
    return l[0] + (l[1] - l[0]) * t;
}
double distance_LP(const Line &l, const Point &p){
    return abs(p - projection(l, p));
}
int Count(const Line &l, const vector<Circle> &c1, const vector<Circle> &c2)
{
    const int n = c1.size();
    int res = 0;

    for (int i = 0; i < n; ++i) {
        double d = distance_LP(l, Point(c1[i].x, c1[i].y));
        if ((c1[i].r - d < EPS) && (d - c2[i].r < EPS))
            ++res;
    }
    return res;
}

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    int N;

    while (cin >> N, N) {

        vector<Circle> c1(N), c2(N);
        for (int i = 0; i < N; ++i) {
            cin >> c1[i].x >> c1[i].y >> c1[i].r >> c2[i].r;
            c2[i].r += c1[i].r;
            c2[i].x = c1[i].x;
            c2[i].y = c1[i].y;
        }

        if (N == 1) {
            cout << "1\n";
            continue;
        }

        int res = 0;
        for (int i = 0; i < N; ++i)
            for (int j = i + 1; j < N; ++j) {
                vector<Line> l1 = tangentCC(c1[i], c1[j]);
                vector<Line> l2 = tangentCC(c1[i], c2[j]);
                vector<Line> l3 = tangentCC(c2[i], c1[j]);
                vector<Line> l4 = tangentCC(c2[i], c2[j]);

                for (auto l : l1)
                    res = max(res, Count(l, c1, c2));
                for (auto l : l2)
                    res = max(res, Count(l, c1, c2));
                for (auto l : l3)
                    res = max(res, Count(l, c1, c2));
                for (auto l : l4)
                    res = max(res, Count(l, c1, c2));
            }

        cout << res << endl;
    }

    return 0;
}

Measured memory_bytes: 1260