#include <bits/stdc++.h>
using namespace std;

#define rep(i,x,y) for(int i=(x);i<(y);++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define show(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define show(x)
#endif

typedef long long int ll;
typedef pair<int,int> pii;
template<typename T> using vec=std::vector<T>;

const int inf=1<<30;
const long long int infll=1LL<<62;
const double eps=1e-9;
const int dx[]={1,0,-1,0},dy[]={0,1,0,-1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec){
    os << "[";
    for (const auto &v : vec) {
    	os << v << ",";
    }
    os << "]";
    return os;
}

typedef complex<long double> point;
typedef pair<point,point> line;
point polar(const long double &r, const long double &th) { return point(r*cosl(th),r*sinl(th)); }
bool equal(const long double x1,const long double x2){ return abs(x1-x2)<eps; }
bool equal(const point& a,const point& b){ return equal(a.real(),b.real()) and equal(a.imag(),b.imag()); }
long double length(const point& a){ return abs(a); }
long double distance(const point& a,const point& b){ return abs(a-b); }
long double dot(const point& a,const point& b){ return a.real()*b.real()+a.imag()*b.imag(); }
long double cross(const point& a,const point& b){ return a.real()*b.imag()-a.imag()*b.real(); }
bool is_orthogonal(const point& a1,const point& a2,const point& b1,const point& b2){ return equal(dot(a1-a2,b1-b2),0.0); }
bool is_orthogonal(const line& l,const line& m){ return is_orthogonal(l.first,l.second,m.first,m.second); }
bool is_parallel(const point& a1,const point& a2,const point& b1,const point& b2){ return equal(cross(a1-a2, b1-b2),0.0); }
bool is_parallel(const line& l,const line& m){ return is_parallel(l.first,l.second,m.first,m.second); }
int ccw(point a,point b,point c) {
    b-=a; c-=a;
    if(cross(b, c) > 0)   return +1;       // counter clockwise
    if(cross(b, c) < 0)   return -1;       // clockwise
    if(dot(b, c) < 0)     return +2;       // c--a--b on line
    if(norm(b) < norm(c)) return -2;       // a--b--c on line
    return 0;
}
point projection(const line& l, const point& p) {
    long double t = dot(p-l.first, l.first-l.second) / norm(l.first-l.second);
    return l.first + t*(l.first-l.second);
}
long double distanceLP(const line &l, const point& p){
    return abs(p - projection(l, p));
}

struct circle{
    point o;
    long double r;
    circle(){}
    circle(const point o,const long double r):o(o),r(r){}
};

//2??????????????????
int icc(const circle &c, const circle &d) {
    /*
      1 : intersect
      0 : distinct
      -1: c < d
      -2: c > d

      intersect or contain : true
      distinct             : false
    */
    long double od = abs((c.o-d.o));
    return c.r+d.r<od+eps ? 0 : od+c.r<d.r+eps ? -1 : od+d.r<c.r+eps ? -2 : 1;
}

//?????¨????????????????±???????
pair<point,point> ccc(const circle &c1, const circle &c2) {
    if(!icc(c1,c2)) return pair<point,point>(c1.o,c2.o);
    long double w = abs(c2.o-c1.o), th = arg(c2.o-c1.o);
    long double dth = acosl((c1.r*c1.r+w*w-c2.r*c2.r)/(2.*c1.r*w));
    return std::pair<point,point>(c1.o+polar(c1.r,th-dth),c1.o+polar(c1.r,th+dth));
}

line tangent(const circle &c, const double &th) {
    point h = c.o+polar(c.r,th);
    point p = polar(c.r,th)*point(0,1);
    return line(h-p,h+p);
}

vector<line> common_tangent(const circle &c, const circle &d) {
    vector<line> res;
    long double dist = abs(d.o - c.o), th = arg(d.o - c.o);
    if (abs(c.r - d.r) < dist) { // outer
        long double dth = acosl((c.r - d.r) / dist);
        res.push_back(tangent(c, th - dth));
        res.push_back(tangent(c, th + dth));
    }
    if (abs(c.r + d.r) < dist) {
        long double dth = acos((c.r + d.r) / dist);
        res.push_back(tangent(c, th - dth));
        res.push_back(tangent(c, th + dth));
    }
    return res;
}


void solve(int n){
    vector<circle> cs;
    vector<long double> m(n);
    rep(i,0,n){
        long double x,y,r;
        cin >> x >> y >> r >> m[i];
        cs.push_back(circle(point(x,y),r));
    }
    rep(i,0,n) cs.push_back(circle(cs[i].o,cs[i].r+m[i]));

    vector<line> ls;
    vector<pii> idx;
    rep(i,0,cs.size()) rep(j,i+1,cs.size()){
        auto tmp=common_tangent(cs[i],cs[j]);
        ls.insert(ls.end(),tmp.begin(),tmp.end());
        rep(k,0,tmp.size()) idx.push_back(make_pair(i,j));
    }

    vector<point> ps;
    rep(i,0,n) ps.push_back(cs[i].o);
    rep(i,0,cs.size()) rep(j,i+1,cs.size()){
        if(icc(cs[i],cs[j])!=1) continue;
        auto tmp=ccc(cs[i],cs[j]);
        ps.push_back(tmp.first);
        ps.push_back(tmp.second);
    }
    rep(i,0,ps.size()) rep(j,i+1,ps.size()){
        ls.push_back(line(ps[i],ps[j]));
        idx.push_back(make_pair(-1,-1));
    }

    int ans=1;
    rep(i,0,ls.size()){
        auto &l=ls[i];
        int cnt=0;
        rep(j,0,n){
            auto &c=cs[j];
            long double d=distanceLP(l,c.o)-c.r;
            if(j==idx[i].first or j==idx[i].second or (-eps<=d and d<=m[j]+eps)) ++cnt;
        }
        ans=max(ans,cnt);
    }
    cout << ans << endl;
}

int main(){
    std::cin.tie(0);
    std::ios::sync_with_stdio(false);
    cout.setf(ios::fixed);
    cout.precision(10);
    while(true){
        int n;
        cin >> n;
        if(!n) break;
        solve(n);
    }
    return 0;
}

Measured memory_bytes: 23828