#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inc(i, l, r) for (int i = l; i <= r; i++)

const double eps = 1e-8;
//const double M_PI = acos(-1.0); 

int n;

int sgn(double x) {
    if (fabs(x) < eps) return 0;
    if (x < 0) return -1;
    return 1;
}
double sqr(double x) { return x * x; }
struct Point {
    double x, y;
    Point() {}
    Point(double _x, double _y) {
        x = _x;
        y = _y;
    }
    bool operator==(Point b) const {
        return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;
    }
    bool operator<(Point b) const {
        return sgn(x - b.x) == 0 - sgn(y - b.y) ? 0 : x < b.x;
    }
    Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
    //叉积
    double operator^(const Point &b) const { return x * b.y - y * b.x; }
    //点积
    double operator*(const Point &b) const { return x * b.x + y * b.y; }
    //返回长度
    double len() {
        return hypot(x, y);  //库函数
    }
    //返回长度的平方
    double len2() { return x * x + y * y; }
    //返回两点的距离
    double distance(Point p) { return hypot(x - p.x, y - p.y); }
    Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }
    Point operator*(const double &k) const { return Point(x * k, y * k); }
    Point operator/(const double &k) const { return Point(x / k, y / k); }
};

struct Line {
    Point s, e;
    Line() {}
    Line(Point _s, Point _e) {
        s = _s;
        e = _e;
    }
    double length() { return s.distance(e); }
    double dispointtoline(Point p) {
        return fabs((p - s) ^ (e - s)) / length();
    }
};
struct Circle {
    Point p;
    double r;
    Circle() {}
    Circle(Point _p, double _r) {
        p = _p;
        r = _r;
    }
    // 过一点知道角度和距离 求另一点
    Point GP(double b) { return Point(p.x + cos(b) * r, p.y + sin(b) * r); }

} C[105];
Point u1(double x) { return Point(cos(x), sin(x)); }

vector<Line> GCCI(Circle A, Circle B) {
    vector<Line> v;
    if (A.r < B.r) swap(A, B);
    Point u = B.p - A.p;
    double d = u.len(), rdec = A.r - B.r, radd = A.r + B.r;
    if (sgn(d) == 0 && (A.r - B.r) < eps) {
        //重合, 有无数条公切线
        v.push_back(Line(A.GP(0), A.GP(0) + u1(M_PI / 2)));
        return v;
    }
    double base = atan2(u.y, u.x);
    if (sgn(d - rdec) == 0) {
        //内切
        assert(0);
    }
    double da = acos((A.r - B.r) / d);  // 2条外公切线
    v.push_back(Line(Point(A.GP(base + da)), Point(B.GP(base + da))));
    v.push_back(Line(Point(A.GP(base - da)), Point(B.GP(base - da))));
    if (sgn(d - radd) == 0) {
        v.push_back(Line(A.GP(base), A.GP(base) + u1(base + M_PI / 2)));
    } else if (sgn(d - radd) > 0) {
        da = acos((A.r + B.r) / d);
        v.push_back(Line(A.GP(base + da), B.GP(base + da + M_PI)));
        v.push_back(Line(A.GP(base - da), B.GP(base - da + M_PI)));
    }
    return v;
}

double _x, _y, _r, _m;
Point _p;
struct CCircle {
    double x, y, r, m;
} CC[105];

int main() {
//  freopen("1.in","r",stdin);
//  freopen("1.out","w",stdout);
    while (cin >> n && n) {
        inc(i, 1, n) {
            cin >> CC[i].x >> CC[i].y >> CC[i].r >> CC[i].m;

            C[i].p.x = CC[i].x;
            C[i].p.y = CC[i].y;
            C[i].r = CC[i].r;

            C[i + n] = C[i];
            C[i + n].r = C[i].r + CC[i].m;
        }
        int ans = 1;
        inc(i, 1, 2 * n) {
            inc(j, i , 2 * n) {
                //   printf("%d %d\n", i, j);
                vector<Line> v = GCCI(C[i], C[j]);
                for (Line l : v) {
                    int tmp = 0;
                    inc(k, 1, n) {
                        double dis = l.dispointtoline(Point(CC[k].x, CC[k].y));
                        if (CC[k].r-eps<= dis &&
                            dis <= CC[k].r + CC[k].m+eps )
                            tmp++;
                    }
                  //  if (i == 1 && j == 2 /*&& sgn(l.e.x - 2.22) == 0 */) {
                  //      inc(k, 1, n)
                  //          printf("k=%d dis=%.2f x=%.2f y=%.2f\n", k,
                  //                 l.dispointtoline(Point(CC[i].x, CC[i].y)), CC[i].x, CC[i].y);
                  //  }
                    // printf("%.2f %.2f  %.2f %.2f tmp=%d\n", l.e.x, l.e.y,
                    //      l.s.x, l.s.y, tmp);
                //    if(tmp==5) {
                 ///   	printf("%d %d %.2f %.2f %.2f %.2f\n",i,j, l.e.x, l.e.y, l.s.x, l.s.y );
                  //  	inc(k,1,n) printf("k=%d dis=%.2f %.2f %.2f\n",k,l.dispointtoline(Point(CC[i].x, CC[i].y)),CC[]);
				//	} 
					ans = max(ans, tmp);
                }
            }
        }
        cout << ans << "\n";
    }
}
/*
12
851 -53 86 57
-95 -4 59 18
616 241 73 45
155 239 89 45
512 -274 16 89
-106 570 19 7
154 724 22 68
-46 950 54 2
-90 -588 52 87
182 -204 97 70
342 -438 100 24
995 -800 22 26
0
*/


Measured memory_bytes: 3612