1e887ea33SDavid du Colombier #include "l.h"
2e887ea33SDavid du Colombier
3e887ea33SDavid du Colombier #define Dbufslop 100
4e887ea33SDavid du Colombier
5e887ea33SDavid du Colombier #define PADDR(a) ((a) & ~0xfffffffff0000000ull)
6e887ea33SDavid du Colombier
7e887ea33SDavid du Colombier vlong
entryvalue(void)8e887ea33SDavid du Colombier entryvalue(void)
9e887ea33SDavid du Colombier {
10e887ea33SDavid du Colombier char *a;
11e887ea33SDavid du Colombier Sym *s;
12e887ea33SDavid du Colombier
13e887ea33SDavid du Colombier a = INITENTRY;
14e887ea33SDavid du Colombier if(*a >= '0' && *a <= '9')
15e887ea33SDavid du Colombier return atolwhex(a);
16e887ea33SDavid du Colombier s = lookup(a, 0);
17e887ea33SDavid du Colombier if(s->type == 0)
18e887ea33SDavid du Colombier return INITTEXT;
19e887ea33SDavid du Colombier switch(s->type) {
20e887ea33SDavid du Colombier case STEXT:
21e887ea33SDavid du Colombier break;
22e887ea33SDavid du Colombier case SDATA:
23e887ea33SDavid du Colombier if(dlm)
24e887ea33SDavid du Colombier return s->value+INITDAT;
25e887ea33SDavid du Colombier default:
26e887ea33SDavid du Colombier diag("entry not text: %s", s->name);
27e887ea33SDavid du Colombier }
28e887ea33SDavid du Colombier return s->value;
29e887ea33SDavid du Colombier }
30e887ea33SDavid du Colombier
31*40d01547SDavid du Colombier /* these need to take long arguments to be compatible with elf.c */
32*40d01547SDavid du Colombier void
wputl(long w)338153b942SDavid du Colombier wputl(long w)
34e887ea33SDavid du Colombier {
35e887ea33SDavid du Colombier cput(w);
36e887ea33SDavid du Colombier cput(w>>8);
37e887ea33SDavid du Colombier }
38e887ea33SDavid du Colombier
39e887ea33SDavid du Colombier void
wput(long w)408153b942SDavid du Colombier wput(long w)
41e887ea33SDavid du Colombier {
42e887ea33SDavid du Colombier cput(w>>8);
43e887ea33SDavid du Colombier cput(w);
44e887ea33SDavid du Colombier }
45e887ea33SDavid du Colombier
46e887ea33SDavid du Colombier void
lput(long l)47e887ea33SDavid du Colombier lput(long l)
48e887ea33SDavid du Colombier {
49e887ea33SDavid du Colombier cput(l>>24);
50e887ea33SDavid du Colombier cput(l>>16);
51e887ea33SDavid du Colombier cput(l>>8);
52e887ea33SDavid du Colombier cput(l);
53e887ea33SDavid du Colombier }
54e887ea33SDavid du Colombier
55e887ea33SDavid du Colombier void
llput(vlong v)56e887ea33SDavid du Colombier llput(vlong v)
57e887ea33SDavid du Colombier {
58e887ea33SDavid du Colombier lput(v>>32);
59e887ea33SDavid du Colombier lput(v);
60e887ea33SDavid du Colombier }
61e887ea33SDavid du Colombier
62e887ea33SDavid du Colombier void
lputl(long l)63e887ea33SDavid du Colombier lputl(long l)
64e887ea33SDavid du Colombier {
65e887ea33SDavid du Colombier cput(l);
66e887ea33SDavid du Colombier cput(l>>8);
67e887ea33SDavid du Colombier cput(l>>16);
68e887ea33SDavid du Colombier cput(l>>24);
69e887ea33SDavid du Colombier }
70e887ea33SDavid du Colombier
71e887ea33SDavid du Colombier void
llputl(vlong v)72b87cd620SDavid du Colombier llputl(vlong v)
73b87cd620SDavid du Colombier {
74b87cd620SDavid du Colombier lputl(v);
75b87cd620SDavid du Colombier lputl(v>>32);
76b87cd620SDavid du Colombier }
77b87cd620SDavid du Colombier
78b87cd620SDavid du Colombier void
strnput(char * s,int n)79e887ea33SDavid du Colombier strnput(char *s, int n)
80e887ea33SDavid du Colombier {
81e887ea33SDavid du Colombier for(; *s && n > 0; s++){
82e887ea33SDavid du Colombier cput(*s);
83e887ea33SDavid du Colombier n--;
84e887ea33SDavid du Colombier }
85e887ea33SDavid du Colombier while(n > 0){
86e887ea33SDavid du Colombier cput(0);
87e887ea33SDavid du Colombier n--;
88e887ea33SDavid du Colombier }
89e887ea33SDavid du Colombier }
90e887ea33SDavid du Colombier
91e887ea33SDavid du Colombier void
asmb(void)92e887ea33SDavid du Colombier asmb(void)
93e887ea33SDavid du Colombier {
94e887ea33SDavid du Colombier Prog *p;
95e887ea33SDavid du Colombier long v, magic;
96e887ea33SDavid du Colombier int a;
97e887ea33SDavid du Colombier uchar *op1;
98e887ea33SDavid du Colombier vlong vl;
99e887ea33SDavid du Colombier
100e887ea33SDavid du Colombier if(debug['v'])
101e887ea33SDavid du Colombier Bprint(&bso, "%5.2f asmb\n", cputime());
102e887ea33SDavid du Colombier Bflush(&bso);
103e887ea33SDavid du Colombier
104e887ea33SDavid du Colombier seek(cout, HEADR, 0);
105e887ea33SDavid du Colombier pc = INITTEXT;
106e887ea33SDavid du Colombier curp = firstp;
107e887ea33SDavid du Colombier for(p = firstp; p != P; p = p->link) {
108e887ea33SDavid du Colombier if(p->as == ATEXT)
109e887ea33SDavid du Colombier curtext = p;
110e887ea33SDavid du Colombier if(p->pc != pc) {
111e887ea33SDavid du Colombier if(!debug['a'])
112e887ea33SDavid du Colombier print("%P\n", curp);
113e887ea33SDavid du Colombier diag("phase error %llux sb %llux in %s", p->pc, pc, TNAME);
114e887ea33SDavid du Colombier pc = p->pc;
115e887ea33SDavid du Colombier }
116e887ea33SDavid du Colombier curp = p;
117e887ea33SDavid du Colombier asmins(p);
118e887ea33SDavid du Colombier a = (andptr - and);
119e887ea33SDavid du Colombier if(cbc < a)
120e887ea33SDavid du Colombier cflush();
121e887ea33SDavid du Colombier if(debug['a']) {
122e887ea33SDavid du Colombier Bprint(&bso, pcstr, pc);
123e887ea33SDavid du Colombier for(op1 = and; op1 < andptr; op1++)
124e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", *op1 & 0xff);
125e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
126e887ea33SDavid du Colombier }
127e887ea33SDavid du Colombier if(dlm) {
128e887ea33SDavid du Colombier if(p->as == ATEXT)
129e887ea33SDavid du Colombier reloca = nil;
130e887ea33SDavid du Colombier else if(reloca != nil)
131e887ea33SDavid du Colombier diag("reloc failure: %P", curp);
132e887ea33SDavid du Colombier }
133e887ea33SDavid du Colombier memmove(cbp, and, a);
134e887ea33SDavid du Colombier cbp += a;
135e887ea33SDavid du Colombier pc += a;
136e887ea33SDavid du Colombier cbc -= a;
137e887ea33SDavid du Colombier }
138e887ea33SDavid du Colombier cflush();
139e887ea33SDavid du Colombier switch(HEADTYPE) {
140e887ea33SDavid du Colombier default:
141e887ea33SDavid du Colombier diag("unknown header type %ld", HEADTYPE);
142e887ea33SDavid du Colombier case 2:
143e887ea33SDavid du Colombier case 5:
144b87cd620SDavid du Colombier case 6:
145e887ea33SDavid du Colombier seek(cout, HEADR+textsize, 0);
146e887ea33SDavid du Colombier break;
147e887ea33SDavid du Colombier }
148e887ea33SDavid du Colombier
149e887ea33SDavid du Colombier if(debug['v'])
150e887ea33SDavid du Colombier Bprint(&bso, "%5.2f datblk\n", cputime());
151e887ea33SDavid du Colombier Bflush(&bso);
152e887ea33SDavid du Colombier
153e887ea33SDavid du Colombier if(dlm){
154e887ea33SDavid du Colombier char buf[8];
155e887ea33SDavid du Colombier
156e887ea33SDavid du Colombier write(cout, buf, INITDAT-textsize);
157e887ea33SDavid du Colombier textsize = INITDAT;
158e887ea33SDavid du Colombier }
159e887ea33SDavid du Colombier
160e887ea33SDavid du Colombier for(v = 0; v < datsize; v += sizeof(buf)-Dbufslop) {
161e887ea33SDavid du Colombier if(datsize-v > sizeof(buf)-Dbufslop)
162e887ea33SDavid du Colombier datblk(v, sizeof(buf)-Dbufslop);
163e887ea33SDavid du Colombier else
164e887ea33SDavid du Colombier datblk(v, datsize-v);
165e887ea33SDavid du Colombier }
166e887ea33SDavid du Colombier
167e887ea33SDavid du Colombier symsize = 0;
168e887ea33SDavid du Colombier spsize = 0;
169e887ea33SDavid du Colombier lcsize = 0;
170e887ea33SDavid du Colombier if(!debug['s']) {
171e887ea33SDavid du Colombier if(debug['v'])
172e887ea33SDavid du Colombier Bprint(&bso, "%5.2f sym\n", cputime());
173e887ea33SDavid du Colombier Bflush(&bso);
174e887ea33SDavid du Colombier switch(HEADTYPE) {
175e887ea33SDavid du Colombier default:
176e887ea33SDavid du Colombier case 2:
177e887ea33SDavid du Colombier case 5:
178b87cd620SDavid du Colombier case 6:
179e887ea33SDavid du Colombier seek(cout, HEADR+textsize+datsize, 0);
180e887ea33SDavid du Colombier break;
181e887ea33SDavid du Colombier }
182e887ea33SDavid du Colombier if(!debug['s'])
183e887ea33SDavid du Colombier asmsym();
184e887ea33SDavid du Colombier if(debug['v'])
185e887ea33SDavid du Colombier Bprint(&bso, "%5.2f sp\n", cputime());
186e887ea33SDavid du Colombier Bflush(&bso);
187e887ea33SDavid du Colombier if(debug['v'])
188e887ea33SDavid du Colombier Bprint(&bso, "%5.2f pc\n", cputime());
189e887ea33SDavid du Colombier Bflush(&bso);
190e887ea33SDavid du Colombier if(!debug['s'])
191e887ea33SDavid du Colombier asmlc();
192e887ea33SDavid du Colombier if(dlm)
193e887ea33SDavid du Colombier asmdyn();
194e887ea33SDavid du Colombier cflush();
195e887ea33SDavid du Colombier }
196e887ea33SDavid du Colombier else if(dlm){
197e887ea33SDavid du Colombier seek(cout, HEADR+textsize+datsize, 0);
198e887ea33SDavid du Colombier asmdyn();
199e887ea33SDavid du Colombier cflush();
200e887ea33SDavid du Colombier }
201e887ea33SDavid du Colombier if(debug['v'])
202e887ea33SDavid du Colombier Bprint(&bso, "%5.2f headr\n", cputime());
203e887ea33SDavid du Colombier Bflush(&bso);
204e887ea33SDavid du Colombier seek(cout, 0L, 0);
205e887ea33SDavid du Colombier switch(HEADTYPE) {
206e887ea33SDavid du Colombier default:
207e887ea33SDavid du Colombier case 2: /* plan9 */
208e887ea33SDavid du Colombier magic = 4*26*26+7;
209e887ea33SDavid du Colombier magic |= 0x00008000; /* fat header */
210e887ea33SDavid du Colombier if(dlm)
211e887ea33SDavid du Colombier magic |= 0x80000000; /* dlm */
212e887ea33SDavid du Colombier lput(magic); /* magic */
213e887ea33SDavid du Colombier lput(textsize); /* sizes */
214e887ea33SDavid du Colombier lput(datsize);
215e887ea33SDavid du Colombier lput(bsssize);
216e887ea33SDavid du Colombier lput(symsize); /* nsyms */
217e887ea33SDavid du Colombier vl = entryvalue();
218e887ea33SDavid du Colombier lput(PADDR(vl)); /* va of entry */
219e887ea33SDavid du Colombier lput(spsize); /* sp offsets */
220e887ea33SDavid du Colombier lput(lcsize); /* line offsets */
221e887ea33SDavid du Colombier llput(vl); /* va of entry */
222e887ea33SDavid du Colombier break;
223e887ea33SDavid du Colombier case 5:
2248153b942SDavid du Colombier elf32(debug['8']? I386: AMD64, ELFDATA2LSB, 0, nil);
225e887ea33SDavid du Colombier break;
226b87cd620SDavid du Colombier case 6:
2278153b942SDavid du Colombier elf64(AMD64, ELFDATA2LSB, 0, nil);
228b87cd620SDavid du Colombier break;
229e887ea33SDavid du Colombier }
230e887ea33SDavid du Colombier cflush();
231e887ea33SDavid du Colombier }
232e887ea33SDavid du Colombier
233e887ea33SDavid du Colombier void
cflush(void)234e887ea33SDavid du Colombier cflush(void)
235e887ea33SDavid du Colombier {
236e887ea33SDavid du Colombier int n;
237e887ea33SDavid du Colombier
238e887ea33SDavid du Colombier n = sizeof(buf.cbuf) - cbc;
239e887ea33SDavid du Colombier if(n)
240e887ea33SDavid du Colombier write(cout, buf.cbuf, n);
241e887ea33SDavid du Colombier cbp = buf.cbuf;
242e887ea33SDavid du Colombier cbc = sizeof(buf.cbuf);
243e887ea33SDavid du Colombier }
244e887ea33SDavid du Colombier
245e887ea33SDavid du Colombier void
datblk(long s,long n)246e887ea33SDavid du Colombier datblk(long s, long n)
247e887ea33SDavid du Colombier {
248e887ea33SDavid du Colombier Prog *p;
249e887ea33SDavid du Colombier uchar *cast;
250e887ea33SDavid du Colombier long l, fl, j;
251e887ea33SDavid du Colombier vlong o;
252e887ea33SDavid du Colombier int i, c;
253e887ea33SDavid du Colombier
254e887ea33SDavid du Colombier memset(buf.dbuf, 0, n+Dbufslop);
255e887ea33SDavid du Colombier for(p = datap; p != P; p = p->link) {
256e887ea33SDavid du Colombier curp = p;
257e887ea33SDavid du Colombier l = p->from.sym->value + p->from.offset - s;
258e887ea33SDavid du Colombier c = p->from.scale;
259e887ea33SDavid du Colombier i = 0;
260e887ea33SDavid du Colombier if(l < 0) {
261e887ea33SDavid du Colombier if(l+c <= 0)
262e887ea33SDavid du Colombier continue;
263e887ea33SDavid du Colombier while(l < 0) {
264e887ea33SDavid du Colombier l++;
265e887ea33SDavid du Colombier i++;
266e887ea33SDavid du Colombier }
267e887ea33SDavid du Colombier }
268e887ea33SDavid du Colombier if(l >= n)
269e887ea33SDavid du Colombier continue;
270e887ea33SDavid du Colombier if(p->as != AINIT && p->as != ADYNT) {
271e887ea33SDavid du Colombier for(j=l+(c-i)-1; j>=l; j--)
272e887ea33SDavid du Colombier if(buf.dbuf[j]) {
273e887ea33SDavid du Colombier print("%P\n", p);
274e887ea33SDavid du Colombier diag("multiple initialization");
275e887ea33SDavid du Colombier break;
276e887ea33SDavid du Colombier }
277e887ea33SDavid du Colombier }
278e887ea33SDavid du Colombier switch(p->to.type) {
279e887ea33SDavid du Colombier case D_FCONST:
280e887ea33SDavid du Colombier switch(c) {
281e887ea33SDavid du Colombier default:
282e887ea33SDavid du Colombier case 4:
283e887ea33SDavid du Colombier fl = ieeedtof(&p->to.ieee);
284e887ea33SDavid du Colombier cast = (uchar*)&fl;
285e887ea33SDavid du Colombier if(debug['a'] && i == 0) {
286e887ea33SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
287e887ea33SDavid du Colombier for(j=0; j<c; j++)
288e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", cast[fnuxi4[j]]);
289e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
290e887ea33SDavid du Colombier }
291e887ea33SDavid du Colombier for(; i<c; i++) {
292e887ea33SDavid du Colombier buf.dbuf[l] = cast[fnuxi4[i]];
293e887ea33SDavid du Colombier l++;
294e887ea33SDavid du Colombier }
295e887ea33SDavid du Colombier break;
296e887ea33SDavid du Colombier case 8:
297e887ea33SDavid du Colombier cast = (uchar*)&p->to.ieee;
298e887ea33SDavid du Colombier if(debug['a'] && i == 0) {
299e887ea33SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
300e887ea33SDavid du Colombier for(j=0; j<c; j++)
301e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", cast[fnuxi8[j]]);
302e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
303e887ea33SDavid du Colombier }
304e887ea33SDavid du Colombier for(; i<c; i++) {
305e887ea33SDavid du Colombier buf.dbuf[l] = cast[fnuxi8[i]];
306e887ea33SDavid du Colombier l++;
307e887ea33SDavid du Colombier }
308e887ea33SDavid du Colombier break;
309e887ea33SDavid du Colombier }
310e887ea33SDavid du Colombier break;
311e887ea33SDavid du Colombier
312e887ea33SDavid du Colombier case D_SCONST:
313e887ea33SDavid du Colombier if(debug['a'] && i == 0) {
314e887ea33SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
315e887ea33SDavid du Colombier for(j=0; j<c; j++)
316e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff);
317e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
318e887ea33SDavid du Colombier }
319e887ea33SDavid du Colombier for(; i<c; i++) {
320e887ea33SDavid du Colombier buf.dbuf[l] = p->to.scon[i];
321e887ea33SDavid du Colombier l++;
322e887ea33SDavid du Colombier }
323e887ea33SDavid du Colombier break;
324e887ea33SDavid du Colombier default:
325e887ea33SDavid du Colombier o = p->to.offset;
326e887ea33SDavid du Colombier if(p->to.type == D_ADDR) {
327e887ea33SDavid du Colombier if(p->to.index != D_STATIC && p->to.index != D_EXTERN)
328e887ea33SDavid du Colombier diag("DADDR type%P", p);
329e887ea33SDavid du Colombier if(p->to.sym) {
330e887ea33SDavid du Colombier if(p->to.sym->type == SUNDEF)
331e887ea33SDavid du Colombier ckoff(p->to.sym, o);
332e887ea33SDavid du Colombier o += p->to.sym->value;
333e887ea33SDavid du Colombier if(p->to.sym->type != STEXT && p->to.sym->type != SUNDEF)
334e887ea33SDavid du Colombier o += INITDAT;
335e887ea33SDavid du Colombier if(dlm)
336e887ea33SDavid du Colombier dynreloc(p->to.sym, l+s+INITDAT, 1);
337e887ea33SDavid du Colombier }
338e887ea33SDavid du Colombier }
339e887ea33SDavid du Colombier fl = o;
340e887ea33SDavid du Colombier cast = (uchar*)&fl;
341e887ea33SDavid du Colombier switch(c) {
342e887ea33SDavid du Colombier default:
343e887ea33SDavid du Colombier diag("bad nuxi %d %d\n%P", c, i, curp);
344e887ea33SDavid du Colombier break;
345e887ea33SDavid du Colombier case 1:
346e887ea33SDavid du Colombier if(debug['a'] && i == 0) {
347e887ea33SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
348e887ea33SDavid du Colombier for(j=0; j<c; j++)
349e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi1[j]]);
350e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
351e887ea33SDavid du Colombier }
352e887ea33SDavid du Colombier for(; i<c; i++) {
353e887ea33SDavid du Colombier buf.dbuf[l] = cast[inuxi1[i]];
354e887ea33SDavid du Colombier l++;
355e887ea33SDavid du Colombier }
356e887ea33SDavid du Colombier break;
357e887ea33SDavid du Colombier case 2:
358e887ea33SDavid du Colombier if(debug['a'] && i == 0) {
359e887ea33SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
360e887ea33SDavid du Colombier for(j=0; j<c; j++)
361e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi2[j]]);
362e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
363e887ea33SDavid du Colombier }
364e887ea33SDavid du Colombier for(; i<c; i++) {
365e887ea33SDavid du Colombier buf.dbuf[l] = cast[inuxi2[i]];
366e887ea33SDavid du Colombier l++;
367e887ea33SDavid du Colombier }
368e887ea33SDavid du Colombier break;
369e887ea33SDavid du Colombier case 4:
370e887ea33SDavid du Colombier if(debug['a'] && i == 0) {
371e887ea33SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
372e887ea33SDavid du Colombier for(j=0; j<c; j++)
373e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi4[j]]);
374e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
375e887ea33SDavid du Colombier }
376e887ea33SDavid du Colombier for(; i<c; i++) {
377e887ea33SDavid du Colombier buf.dbuf[l] = cast[inuxi4[i]];
378e887ea33SDavid du Colombier l++;
379e887ea33SDavid du Colombier }
380e887ea33SDavid du Colombier break;
381e887ea33SDavid du Colombier case 8:
382e887ea33SDavid du Colombier cast = (uchar*)&o;
383e887ea33SDavid du Colombier if(debug['a'] && i == 0) {
384e887ea33SDavid du Colombier Bprint(&bso, pcstr, l+s+INITDAT);
385e887ea33SDavid du Colombier for(j=0; j<c; j++)
386e887ea33SDavid du Colombier Bprint(&bso, "%.2ux", cast[inuxi8[j]]);
387e887ea33SDavid du Colombier Bprint(&bso, "\t%P\n", curp);
388e887ea33SDavid du Colombier }
389e887ea33SDavid du Colombier for(; i<c; i++) {
390e887ea33SDavid du Colombier buf.dbuf[l] = cast[inuxi8[i]];
391e887ea33SDavid du Colombier l++;
392e887ea33SDavid du Colombier }
393e887ea33SDavid du Colombier break;
394e887ea33SDavid du Colombier }
395e887ea33SDavid du Colombier break;
396e887ea33SDavid du Colombier }
397e887ea33SDavid du Colombier }
398e887ea33SDavid du Colombier write(cout, buf.dbuf, n);
399e887ea33SDavid du Colombier }
400e887ea33SDavid du Colombier
401e887ea33SDavid du Colombier vlong
rnd(vlong v,vlong r)402e887ea33SDavid du Colombier rnd(vlong v, vlong r)
403e887ea33SDavid du Colombier {
404e887ea33SDavid du Colombier vlong c;
405e887ea33SDavid du Colombier
406e887ea33SDavid du Colombier if(r <= 0)
407e887ea33SDavid du Colombier return v;
408e887ea33SDavid du Colombier v += r - 1;
409e887ea33SDavid du Colombier c = v % r;
410e887ea33SDavid du Colombier if(c < 0)
411e887ea33SDavid du Colombier c += r;
412e887ea33SDavid du Colombier v -= c;
413e887ea33SDavid du Colombier return v;
414e887ea33SDavid du Colombier }
415