Print this page
6117 Many small bugs prevent a clean build on SPARC
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/libcurses/screen/maketerm.ed
+++ new/usr/src/lib/libcurses/screen/maketerm.ed
1 1 H
2 2 !rm -f bool num str boolnames numnames strnames boolvals numvals strvals tnames.c tinames.c tifnames.c term.h ./tmp/term.h.new ./tmp/tmp.awk ./tmp/term.h
3 3 e caps
4 4 g/^#/d
5 5 /--- begin bool/+1,/--- end bool/-1 w bool
6 6 /--- begin num/+1,/--- end num/-1 w num
7 7 /--- begin str/+1,/--- end str/-1 w str
8 8 E bool
9 9 1,$s/" .*/", /
10 10 1,$s/.* "/"/
11 11 1,$-10g/^/.,+9j
12 12 +,$j
13 13 1i
14 14 char *boolnames[] =
15 15 {
16 16 .
17 17 $a
18 18 0
19 19 };
20 20
21 21 .
22 22 w tinames.c
23 23 e bool
24 24 1,$s/^[^"]*"[^"]*".//
25 25 1,$s/" .*/", /
26 26 1,$-10g/^/.,+9j
27 27 +,$j
28 28 1i
29 29 char *boolcodes[] =
30 30 {
31 31 .
32 32 $a
33 33 0
34 34 };
35 35
36 36 .
37 37 w tnames.c
38 38 e bool
39 39 1,$s/^\([a-z][0-9a-z_]*\),.*/"\1", /
40 40 1,$-4g/^/.,+3j
41 41 +,$j
42 42 1i
43 43 char *boolfnames[] =
44 44 {
45 45 .
46 46 $a
47 47 0
48 48 };
49 49
50 50 .
51 51 w tifnames.c
52 52 e bool
53 53 1,$s;"[^"]*"[ ]*".." ;/* ;
54 54 1,$s;$; */;
55 55 1,$s;^; ;
56 56 1i
57 57 char
58 58 .
59 59 $a
60 60 Sentinel; /* End of bools. DO NOT MOVE! */
61 61 .
62 62 w boolvals
63 63 e num
64 64 1,$s/" .*/", /
65 65 1,$s/.* "/"/
66 66 1,$-10g/^/.,+9j
67 67 +,$j
68 68 1i
69 69 char *numnames[] =
70 70 {
71 71 .
72 72 $a
73 73 0
74 74 };
75 75
76 76 .
77 77 0r tinames.c
78 78 w tinames.c
79 79 e num
80 80 1,$s/^[^"]*"[^"]*".//
81 81 1,$s/" .*/", /
82 82 1,$-10g/^/.,+9j
83 83 +,$j
84 84 1i
85 85 char *numcodes[] =
86 86 {
87 87 .
88 88 $a
89 89 0
90 90 };
91 91
92 92 .
93 93 0r tnames.c
94 94 w tnames.c
95 95 e num
96 96 1,$s/^\([a-z][0-9a-z_]*\),.*/"\1", /
97 97 1,$-4g/^/.,+3j
98 98 +,$j
99 99 1i
100 100 char *numfnames[] =
101 101 {
102 102 .
103 103 $a
104 104 0
105 105 };
106 106
107 107 .
108 108 0r tifnames.c
109 109 w tifnames.c
110 110 e num
111 111 1,$s;"[^"]*"[ ]*".." ;/* ;
112 112 1,$s;$; */;
113 113 1,$s;^; ;
114 114 1i
115 115 short
116 116 .
117 117 $a
118 118 Sentinel; /* End of nums. DO NOT MOVE! */
119 119 .
120 120 w numvals
121 121 e str
122 122 1,$s/" .*/", /
123 123 1,$s/.* "/"/
124 124 1,$-10g/^/.,+9j
125 125 +,$j
126 126 1i
127 127 char *strnames[] =
128 128 {
129 129 .
130 130 $a
131 131 0
132 132 };
133 133
134 134 .
135 135 0r tinames.c
136 136 w tinames.c
137 137 e str
138 138 1,$s/^[^"]*"[^"]*".//
139 139 1,$s/" .*/", /
140 140 1,$-10g/^/.,+9j
141 141 +,$j
142 142 1i
143 143 char *strcodes[] =
144 144 {
145 145 .
146 146 $a
147 147 0
148 148 };
149 149
150 150 .
151 151 0r tnames.c
152 152 w tnames.c
153 153 e str
154 154 1,$s/^\([a-z][0-9a-z_]*\),.*/"\1", /
155 155 1,$-4g/^/.,+3j
156 156 +,$j
157 157 1i
158 158 char *strfnames[] =
159 159 {
160 160 .
161 161 $a
162 162 0
163 163 };
164 164
165 165 .
166 166 0r tifnames.c
167 167 w tifnames.c
168 168 e str
169 169 1,$s;"[^"]*"[ ]*".." ;/* ;
170 170 1,$s;$; */;
171 171 1,$s;^; strs.;
172 172 $a
173 173 Sentinel; /* End of strings. DO NOT MOVE! */
174 174 .
175 175 w strvals
176 176 1,$d
177 177 r tnames.c
178 178 1i
179 179 /* tnames.c: Made automatically from caps and maketerm.ed - don't edit me! */
180 180 .
181 181 1,$s/ $//
182 182 0r copyright.h
183 183 1,.g/#pragma ident/d
184 184 w tnames.c
185 185 1,$d
186 186 r tinames.c
187 187 1i
188 188 /* tinames.c: Made automatically from caps and maketerm.ed - don't edit me! */
189 189 .
190 190 1,$s/ $//
191 191 0r copyright.h
192 192 1,.g/#pragma ident/d
193 193 w tinames.c
194 194 1,$d
195 195 r tifnames.c
196 196 1i
197 197 /* tifnames.c: Made automatically from caps and maketerm.ed - don't edit me! */
198 198 .
199 199 1,$s/ $//
200 200 0r copyright.h
201 201 1,.g/#pragma ident/d
202 202 w tifnames.c
203 203 e bool
204 204 1,$d
205 205 a
206 206
207 207 typedef char *charptr;
208 208 struct strs {
209 209 charptr
210 210 .
211 211 r strvals
212 212 1,.s/strs\.//
213 213 $a
214 214 };
215 215
216 216 struct _bool_struct {
217 217 .
218 218 r boolvals
219 219 a
220 220 };
221 221
222 222 struct _num_struct {
223 223 .
224 224 r numvals
225 225 a
226 226 };
227 227 .
228 228 w ./tmp/term.h.new
229 229 e ./tmp/term.h.new
230 230 g/^ ./s/^ / _/
231 231 w ./tmp/term.h.new
232 232 e boolvals
233 233 .kb
234 234 .r numvals
235 235 .kn
236 236 1,$v/^ /d
237 237 1,$s/^ //
238 238 1,$s/ [^ ].*/ /
239 239 1,$s/,/ /
240 240 1,'bs/.*/#define & CURB _&/
241 241 'b+1,'ns/.*/#define & CURN _&/
242 242 1,$g/;/d
243 243 w ./tmp/term.h.new2
244 244 e strvals
245 245 1,$v/^ /d
246 246 1,$s/^ //
247 247 1,$s/ [^ ].*/ /
248 248 1,$s/,/ /
249 249 1,$s/.*/#define & CURS _&/
250 250 1,$s/strs\.//
251 251 1,$s/strs.\(.\)/strs._\1/
252 252 1,$g/;/d
253 253 w
254 254 e ./tmp/term.h.new2
255 255 $r strvals
256 256 w ./tmp/term.h.new1
257 257 e ./tmp/term.h.new1
258 258 $r ./tmp/term.h.new
259 259 w ./tmp/term.h.new
260 260 e ./tmp/term.h.new
261 261 1,$s/[ ]*$//
262 262 1,$s/CURS _strs/CURS strs/
263 263 w ./tmp/term.h.new
264 264 e ./tmp/term.h.new
265 265 1;/CURS strs/+100;.,+99s/CURS strs/CURS strs2/
266 266 .+1,+100s/CURS strs/CURS strs3/
267 267 .+1,$s/CURS strs/CURS strs4/
268 268 /^struct strs/+101s/,/;/
269 269 a
270 270 };
271 271
272 272 struct strs2 {
273 273 charptr
274 274 .
275 275 +100s/,/;/
276 276 a
277 277 };
278 278
279 279 struct strs3 {
280 280 charptr
281 281 .
282 282 +100s/,/;/
283 283 a
284 284 };
285 285
286 286 struct strs4 {
287 287 charptr
288 288 .
289 289 1,$s/_Sentinel/Sentinel/
290 290 w ./tmp/term.h.new
291 291 e ./tmp/term.h.new
292 292 g/[ .]_cursor_/s/_cursor_/_crsr_/
293 293 g/[ .]_delete_/s/_delete_/_dlt_/
294 294 g/[ .]_enter_/s/_enter_/_entr_/
295 295 g/[ .]_insert_/s/_insert_/_ins_/
296 296 g/[ .]_key_/s/_key_/_ky_/
297 297 g/[ .]_keypad_/s/_keypad_/_kpad_/
298 298 g/[ .]_label_/s/_label_/_labl_/
299 299 g/[ .]_memory_/s/_memory_/_mem_/
300 300 g/[ .]_parm_/s/_parm_/_prm_/
↓ open down ↓ |
300 lines elided |
↑ open up ↑ |
301 301 g/[ .]_scroll_/s/_scroll_/_scrll_/
302 302 g/^ _......[,;] \//s/, /,/
303 303 g/^ _..............[,;] \//s/, /,/
304 304 g/^ _......................[,;] \//s/, /,/
305 305 w ./tmp/term.h.new
306 306 e ./tmp/term.h.new
307 307 !# the following lines GO away when Vr2 compat code goes away
308 308 1;/^#define auto_left_margin/,/^#define xon_xoff/s/CURB.*/CUR _b/
309 309 1;/^#define auto_left_margin/,/^#define xon_xoff/w ./tmp/tmp.term.h
310 310 1;/^#define auto_left_margin/,/^#define xon_xoff/d
311 -!/usr/bin/echo '{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
311 +!/usr/bin/print '{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
312 312 .-1r !awk -f ./tmp/tmp.awk < ./tmp/tmp.term.h
313 313 1;/^#define columns/,/^#define width_status_line/s/CURN.*/CUR _c/
314 314 1;/^#define columns/,/^#define width_status_line/w ./tmp/tmp.term.h
315 315 1;/^#define columns/,/^#define width_status_line/d
316 -!/usr/bin/echo '{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
316 +!/usr/bin/print '{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
317 317 .-1r !awk -f ./tmp/tmp.awk < ./tmp/tmp.term.h
318 318 1;/^#define back_tab/,/^#define lab_f8/s/CURS.*/CUR _Vr2_Astrs._s/
319 319 1;/^#define back_tab/,/^#define lab_f8/w ./tmp/tmp.term.h
320 320 1;/^#define back_tab/,/^#define lab_f8/d
321 -!/usr/bin/echo '{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
321 +!/usr/bin/print '{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
322 322 .-1r !awk -f ./tmp/tmp.awk < ./tmp/tmp.term.h
323 323 1;/^#define lab_f9/,/^#define prtr_non/s/CURS.*/CUR _Vr2_Bstrs._s/
324 324 1;/^#define lab_f9/,/^#define prtr_non/w ./tmp/tmp.term.h
325 325 1;/^#define lab_f9/,/^#define prtr_non/d
326 -!/usr/bin/echo 'BEGIN{i=100}\n{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
326 +!/usr/bin/print 'BEGIN{i=100}\n{printf "\%s\%d\\n", $0,++i}' > ./tmp/tmp.awk
327 327 .-1r !awk -f ./tmp/tmp.awk < ./tmp/tmp.term.h
328 328 !rm -f ./tmp/tmp.term.h ./tmp/tmp.awk
329 329 w ./tmp/term.h.new
330 330 e ./tmp/term.h.new
331 331 !# Vr2 compat code ends here
332 332 1i
333 333 #ifndef _TERM_H
334 334 #define _TERM_H
335 335
336 336 /*
337 337 * term.h - this file is automatically made from caps and maketerm.ed.
338 338 * Don't make changes directly to term.h.
339 339 */
340 340
341 341 #ifdef __cplusplus
342 342 extern "C" {
343 343 #endif
344 344
345 345 .
346 346 $a
347 347
348 348 struct _str_struct {
349 349 struct strs strs;
350 350 struct strs2 strs2;
351 351 struct strs3 strs3;
352 352 struct strs4 strs4;
353 353 };
354 354
355 355 #define NUM_ATTRIBUTES 9
356 356 #define UNACCESSIBLE 1
357 357 #define NO_TERMINAL 2
358 358 #define CORRUPTED 3
359 359 #define ENTRY_TOO_LONG 4
360 360 #define TERMINFO_TOO_LONG 5
361 361 #define TERM_BAD_MALLOC 6
362 362 #define NOT_READABLE 7
363 363 #define _VR2_COMPAT_CODE
364 364 #ifdef _VR2_COMPAT_CODE
365 365 struct _Vr2_Astrs {
366 366 charptr
367 367 _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10,
368 368 _s11, _s12, _s13, _s14, _s15, _s16, _s17, _s18, _s19, _s20,
369 369 _s21, _s22, _s23, _s24, _s25, _s26, _s27, _s28, _s29, _s30,
370 370 _s31, _s32, _s33, _s34, _s35, _s36, _s37, _s38, _s39, _s40,
371 371 _s41, _s42, _s43, _s44, _s45, _s46, _s47, _s48, _s49, _s50,
372 372 _s51, _s52, _s53, _s54, _s55, _s56, _s57, _s58, _s59, _s60,
373 373 _s61, _s62, _s63, _s64, _s65, _s66, _s67, _s68, _s69, _s70,
374 374 _s71, _s72, _s73, _s74, _s75, _s76, _s77, _s78, _s79, _s80,
375 375 _s81, _s82, _s83, _s84, _s85, _s86, _s87, _s88, _s89, _s90,
376 376 _s91, _s92, _s93, _s94, _s95, _s96, _s97, _s98, _s99, _s100;
377 377 };
378 378
379 379 struct _Vr2_Bstrs {
380 380 charptr
381 381 _s101, _s102, _s103, _s104, _s105, _s106, _s107, _s108, _s109, _s110,
382 382 _s111, _s112, _s113, _s114, _s115, _s116, _s117, _s118, _s119, _s120,
383 383 _s121, _s122, _s123, _s124, _s125, _s126, _s127, _s128, _s129, _s130,
384 384 _s131, _s132, _s133, _s134, _s135, _s136, _s137, _s138, _s139, _s140,
385 385 _s141, _s142, _s143, _s144, _s145;
386 386 };
387 387 #endif /* _VR2_COMPAT_CODE */
388 388
389 389 typedef struct {
390 390 char *_sends; /* Characters sent when key is pressed */
391 391 short _keyval; /* "char" we pass back to program */
392 392 } _KEY_MAP;
393 393
394 394 typedef struct {
395 395 short foreground; /* foreground color */
396 396 short background; /* background color */
397 397 bool init; /* TRUE if pair was initialized */
398 398 } _Color_pair;
399 399
400 400
401 401 typedef struct {
402 402 short r, g, b;
403 403 } _Color;
404 404
405 405
406 406 /*
407 407 * This definition for the term struct allows the boolean, number
408 408 * and string information to grow in the future and still allow .o
409 409 * compatibility.
410 410 */
411 411
412 412 struct term {
413 413 #ifdef _VR2_COMPAT_CODE
414 414 char
415 415 _b1, _b2, _b3, _b4, _b5, _b6, _b7, _b8, _b9, _b10,
416 416 _b11, _b12, _b13, _b14, _b15, _b16, _b17, _b18, _b19, _b20, _b21;
417 417 short
418 418 _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8;
419 419 struct _Vr2_Astrs _Vr2_Astrs;
420 420 struct _Vr2_Bstrs _Vr2_Bstrs;
421 421 #endif /* _VR2_COMPAT_CODE */
422 422 short Filedes; /* file descriptor being written to */
423 423 SGTTY Ottyb, /* original state of the terminal */
424 424 Nttyb; /* current state of the terminal */
425 425 #ifdef SYSV
426 426 SGTTYS Ottybs, /* original state of the terminal */
427 427 Nttybs; /* current state of the terminal */
428 428 #endif
429 429 #ifdef DIOCSETT
430 430 struct termcb new, old; /* CB/UNIX virtual terminals */
431 431 #endif
432 432 #ifdef LTILDE
433 433 int newlmode, oldlmode; /* BSD tty driver */
434 434 #endif
435 435 /* end of Vr2 structure */
436 436 struct _bool_struct *_bools;
437 437 struct _num_struct *_nums;
438 438 struct _str_struct *_strs;
439 439 char *_strtab;
440 440 #ifdef FIONREAD
441 441 long timeout; /* for BSD halfdelay mode */
442 442 #endif
443 443 /* end of Vr3 structure */
444 444 chtype sgr_mode; /* current phys. graphic rendition */
445 445 chtype sgr_faked; /* attributes faked by vidputs */
446 446 int _delay; /* timeout for inputs */
447 447 int _inputfd; /* input file descriptor */
448 448 int _check_fd; /* typeahead file descriptor */
449 449 _KEY_MAP **_keys, /* key map */
450 450 *internal_keys; /* pointer to free key structures */
451 451 short _ksz, /* size of keymap */
452 452 _lastkey_ordered, /* where the last ordered key is */
453 453 _lastmacro_ordered, /* where last ordered macro is */
454 454 _first_macro;
455 455 bool funckeystarter[0400];
456 456 /* map of which chars start fn keys */
457 457 bool _fl_rawmode, /* in cbreak(=1) or raw(=2) mode */
458 458 fl_typeahdok, /* ok to use typeahead */
459 459 _cursorstate, /* cursor: 0=invis, 1=norm, 2=vvis */
460 460 _iwait; /* true if input-pending */
461 461 short _regs[26]; /* tparm static registers */
462 462 #define INP_QSIZE 32
463 463 chtype /* a place to put stuff ungetch'ed */
464 464 _input_queue[INP_QSIZE];
465 465 short _ungotten; /* # chars ungotten by ungetch() */
466 466 char _chars_on_queue; /* # chars on queue */
467 467 #ifdef _VR3_COMPAT_CODE
468 468 _ochtype *_acsmap;
469 469 chtype *_acs32map; /* map of alternate char set chars */
470 470 #else /* _VR3_COMPAT_CODE */
471 471 chtype *_acsmap; /* map of alternate char set chars */
472 472 #endif /* _VR3_COMPAT_CODE */
473 473 char *turn_on_seq[NUM_ATTRIBUTES];
474 474 chtype bit_vector;
475 475 char *cursor_seq[3];
476 476 char _termname[15];
477 477 char *turn_off_seq[3];
478 478 chtype check_turn_off;
479 479 chtype non_faked_mode;
480 480 _Color_pair _cur_pair;
481 481 _Color_pair *_pairs_tbl;
482 482 _Color *_color_tbl;
483 483 };
484 484
485 485 typedef struct term TERMINAL;
486 486
487 487 /* allow old names for these capabilities */
488 488 #define beehive_glitch no_esc_ctlc
489 489 #define teleray_glitch dest_tabs_magic_smso
490 490
491 491 extern TERMINAL *cur_term;
492 492 extern struct _bool_struct *cur_bools;
493 493 extern struct _num_struct *cur_nums;
494 494 extern struct _str_struct *cur_strs;
495 495
496 496 #ifdef SINGLE
497 497 extern TERMINAL _first_term;
498 498 extern struct _bool_struct _frst_bools;
499 499 extern struct _num_struct _frst_nums;
500 500 extern struct _str_struct _frst_strs;
501 501
502 502 #define CUR _first_term.
503 503 #define CURB _frst_bools.
504 504 #define CURN _frst_nums.
505 505 #define CURS _frst_strs.
506 506 #define PROGTTY _first_term.Nttyb
507 507 #define SHELLTTY _first_term.Ottyb
508 508 #ifdef SYSV
509 509 #define PROGTTYS _first_term.Nttybs
510 510 #define SHELLTTYS _first_term.Ottybs
511 511 #endif
512 512 #else
513 513 #define CUR cur_term->
514 514 #define CURB cur_bools->
515 515 #define CURN cur_nums->
516 516 #define CURS cur_strs->
517 517 #define PROGTTY (cur_term->Nttyb)
518 518 #define SHELLTTY (cur_term->Ottyb)
519 519 #ifdef SYSV
520 520 #define PROGTTYS (cur_term->Nttybs)
521 521 #define SHELLTTYS (cur_term->Ottybs)
522 522 #endif
523 523 #endif
524 524
525 525 #ifndef NOMACROS
526 526 #define set_curterm setcurterm
527 527 #define del_curterm delterm
528 528 #else /* NOMACROS */
529 529
530 530 #ifdef __STDC__
531 531 extern TERMINAL *set_curterm(TERMINAL *);
532 532 extern int del_curterm(TERMINAL *);
533 533 #else /* __STDC__ */
534 534 extern TERMINAL *set_curterm();
535 535 extern int del_curterm();
536 536 #endif /* __STDC__ */
537 537
538 538 #endif /* NOMACROS */
539 539
540 540 extern short term_errno;
541 541
542 542 #ifdef SYSV
543 543 extern int prog_istermios;
544 544 extern int shell_istermios;
545 545 #endif
546 546
547 547 extern char term_parm_err[], *term_err_strings[], *Def_term,
548 548 *boolnames[], *boolcodes[], *boolfnames[],
549 549 *numnames[], *numcodes[], *numfnames[],
550 550 *strnames[], *strcodes[], *strfnames[];
551 551
552 552 #ifdef __STDC__
553 553 extern TERMINAL *setcurterm(TERMINAL *);
554 554
555 555 #if defined(_XPG4_2) || defined(_LP64) || defined(__cplusplus)
556 556 extern char
557 557 *tparm(char *, long, long, long, long, long, long, long, long, long);
558 558 #else
559 559 /* this is wrong, but is needed for historical reasons */
560 560 extern char *tparm();
561 561 #endif
562 562
563 563 extern char *tgoto(char *, int, int),
564 564 *tgetstr(char *, char **),
565 565 *tigetstr(char *),
566 566 *termname(void);
567 567
568 568 extern int tgetent(char *, char *), tgetflag(char *), tgetnum(char *),
569 569 tputs(char *, int, int (*)(char)), putp(char *),
570 570 tigetint(char *), tigetflag(char *), tigetnum(char *),
571 571 vidputs(chtype, int (*)(char)), vidattr(chtype);
572 572
573 573 extern int resetterm(void), fixterm(void), saveterm(void),
574 574 restartterm(char *, int, int *), delterm(TERMINAL *);
575 575
576 576 extern void termerr(void), tinputfd(int);
577 577 #else /* __STDC__ */
578 578 extern TERMINAL *setcurterm();
579 579 extern char *tparm(), *tgoto(), *tgetstr(), *tigetstr(),
580 580 *termname();
581 581
582 582 extern int tgetent(), tgetflag(), tgetnum(),
583 583 tigetint(), tigetflag(), tigetnum(),
584 584 tputs(), putp(), vidputs(), vidattr();
585 585
586 586 extern int resetterm(), fixterm(), saveterm(),
587 587 restartterm(), delterm();
588 588
589 589 extern void termerr(), tinputfd();
590 590 #endif /* __STDC__ */
591 591
592 592 #ifdef __cplusplus
593 593 }
594 594 #endif
595 595
596 596 #endif /* _TERM_H */
597 597 .
598 598 0r copyright.h
599 599 1,.g/#pragma ident/d
600 600 g/\@(\#)maketerm.ed/s//\@(\#)term.h/
601 601 1,$s/,\/\*/, \/\*/
602 602 w term.h
603 603 !rm -f boolnames boolvals bool numnames numvals num strnames strvals str ./tmp/term.h.new ./tmp/tmp.awk ./tmp/tmp.term.h
604 604 q
↓ open down ↓ |
268 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX