     1                                  ; ****************************************************************************
     2                                  ; pwd386.s (pwd1.s) - by Erdogan Tan - 05/05/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1 - pwd - print working directory pathname
     5                                  ;
     6                                  ; [ Last Modification: 06/05/2022 ]
     7                                  ;
     8                                  ; Derived from (original) UNIX v5 'pwd.c' source Code
     9                                  ; Ref:
    10                                  ; www.tuhs.org (https://minnie.tuhs.org)
    11                                  ; v5root.tar.gz
    12                                  ; ****************************************************************************
    13                                  ; [ usr/source/s2/pwd.c (archive date: 27-11-1974) ]
    14                                  
    15                                  ; pwd0.s - Retro UNIX 8086 v1 (16 bit version of 'pwd1.s')
    16                                  ; pwd1.s - Retro UNIX 386 v1 (unix v1 inode structure)
    17                                  ; pwd2.s - Retro UNIX 386 v1.1 (16 byte directory entries)
    18                                  ; pwd3.s - Retro UNIX 386 v1.2 (& v2) (modified unix v7 inode)
    19                                  
    20                                  ; UNIX v1 system calls
    21                                  _rele 	equ 0
    22                                  _exit 	equ 1
    23                                  _fork 	equ 2
    24                                  _read 	equ 3
    25                                  _write	equ 4
    26                                  _open	equ 5
    27                                  _close 	equ 6
    28                                  _wait 	equ 7
    29                                  _creat 	equ 8
    30                                  _link 	equ 9
    31                                  _unlink	equ 10
    32                                  _exec	equ 11
    33                                  _chdir	equ 12
    34                                  _time 	equ 13
    35                                  _mkdir 	equ 14
    36                                  _chmod	equ 15
    37                                  _chown	equ 16
    38                                  _break	equ 17
    39                                  _stat	equ 18
    40                                  _seek	equ 19
    41                                  _tell 	equ 20
    42                                  _mount	equ 21
    43                                  _umount	equ 22
    44                                  _setuid	equ 23
    45                                  _getuid	equ 24
    46                                  _stime	equ 25
    47                                  _quit	equ 26	
    48                                  _intr	equ 27
    49                                  _fstat	equ 28
    50                                  _emt 	equ 29
    51                                  _mdate 	equ 30
    52                                  _stty 	equ 31
    53                                  _gtty	equ 32
    54                                  _ilgins	equ 33
    55                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    56                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    57                                  
    58                                  ;;;
    59                                  ESCKey equ 1Bh
    60                                  EnterKey equ 0Dh
    61                                  
    62                                  %macro sys 1-4
    63                                      ; 03/09/2015	
    64                                      ; 13/04/2015
    65                                      ; Retro UNIX 386 v1 system call.		
    66                                      %if %0 >= 2   
    67                                  	mov ebx, %2
    68                                  	%if %0 >= 3    
    69                                  	    mov ecx, %3
    70                                  	    %if %0 = 4
    71                                  	       mov edx, %4   
    72                                  	    %endif
    73                                  	%endif
    74                                      %endif
    75                                      mov eax, %1
    76                                      int 30h	   
    77                                  %endmacro
    78                                  
    79                                  ; Retro UNIX 386 v1 system call format:
    80                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    81                                  
    82                                  [BITS 32] ; 32-bit intructions (for 80386 protected mode)
    83                                  
    84                                  [ORG 0] 
    85                                  
    86                                  START_CODE:
    87                                  	; 06/05/2022
    88                                  	; 05/05/2022
    89                                  
    90                                  ;main() {
    91                                  ;	int n;
    92                                  
    93                                  	;  clear (reset) stack (not necessary)
    94 00000000 59                      	pop	ecx ; ecx = number of arguments
    95                                  pwd_0:
    96 00000001 58                      	pop	eax ; eax = argument 0 = executable file name
    97 00000002 E2FD                    	loop	pwd_0
    98                                  
    99                                  	;mov	byte [y.zero], 0 ; (not necessary)
   100                                  			; (because Retro UNIX kernel
   101                                  			; clears bss -memory page- while
   102                                  			; assigning it to program)
   103                                  	;mov	 dword [off], 0
   104                                  
   105                                  	; 06/05/2022
   106 00000004 FF0D[9C030000]          	dec	dword [off] 
   107                                  
   108                                  ;loop0:
   109                                  ;	stat(dot, &x);
   110                                  ;	if((file = open(dotdot,0)) < 0) prname();
   111                                  
   112                                  loop0:
   113                                  	sys	_stat, dot, _x
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 0000000A BB[8A010000]        <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69 0000000F B9[A0030000]        <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71                              <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 00000014 B812000000          <1>  mov eax, %1
    76 00000019 CD30                <1>  int 30h
   114                                  
   115                                  	sys	_open, dotdot, 0  ; open for read
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 0000001B BB[89010000]        <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69 00000020 B900000000          <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71                              <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 00000025 B805000000          <1>  mov eax, %1
    76 0000002A CD30                <1>  int 30h
   116 0000002C 725B                    	jc	short prname
   117                                  
   118                                  ;loop1:
   119                                  ;	if((n = read(file,&y,16)) < 16) prname();
   120                                  ;	if(y.jnum != x.inum)goto loop1;
   121                                  ;	close(file);
   122                                  ;	if(y.jnum == 1) ckroot();
   123                                  ;	cat();
   124                                  ;	chdir(dotdot);
   125                                  ;	goto loop0;
   126                                  ;}
   127                                  
   128 0000002E A3[98030000]            	mov	[file], eax
   129                                  loop1:
   130                                  	sys	_read, [file], _y, 10 ; Retro UNIX 386 v1
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 00000033 8B1D[98030000]      <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69 00000039 B9[C2030000]        <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71 0000003E BA0A000000          <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 00000043 B803000000          <1>  mov eax, %1
    76 00000048 CD30                <1>  int 30h
   131                                  	;sys	_read, [file], _y, 16 ; Retro UNIX 386 v1.1 & v1.2
   132 0000004A 723D                    	jc	short prname
   133                                  	;cmp	eax, 10	 ; cmp eax, 16
   134                                  	;jb	short prname	
   135 0000004C 09C0                    	or	eax, eax
   136 0000004E 7439                    	jz	short prname
   137 00000050 66A1[C2030000]          	mov	ax, [jnum]	   
   138 00000056 663B05[A0030000]        	cmp	ax, [inum]
   139 0000005D 75D4                    	jne	short loop1
   140                                  	sys	_close, [file]
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 0000005F 8B1D[98030000]      <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69                              <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71                              <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 00000065 B806000000          <1>  mov eax, %1
    76 0000006A CD30                <1>  int 30h
   141                                  	;cmp	word [jnum], 1	; Retro UNIX 386 v1.2
   142 0000006C 66833D[C2030000]29      	cmp	word [jnum], 41 ; root dir inode number
   143 00000074 7454                    	je	short ckroot
   144 00000076 E8B8000000              	call	cat
   145                                  	sys	_chdir, dotdot
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 0000007B BB[89010000]        <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69                              <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71                              <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 00000080 B80C000000          <1>  mov eax, %1
    76 00000085 CD30                <1>  int 30h
   146 00000087 EB81                    	jmp	short loop0
   147                                  
   148                                  ;prname() {
   149                                  ;	name[off] = '\n';
   150                                  ;	write(1,name,off+1);
   151                                  ;	exit();
   152                                  
   153                                  prname:
   154                                  	sys	_write, 1, nextline, 3	; 06/05/2022
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 00000089 BB01000000          <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69 0000008E B9[8C010000]        <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71 00000093 BA03000000          <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 00000098 B804000000          <1>  mov eax, %1
    76 0000009D CD30                <1>  int 30h
   155                                  
   156 0000009F 8B35[9C030000]          	mov	esi, [off]
   157                                  	;mov	byte [esi+name], 0Dh ; CR
   158 000000A5 66C786[98010000]0D-     	mov	word [esi+name], 0A0Dh  ; CRLF 
   158 000000AD 0A                 
   159                                  	;inc	dword [off]
   160 000000AE 46                      	inc	esi
   161 000000AF 46                      	inc	esi
   162                                  	;mov	[off], esi
   163                                  	;sys	_write, 1, name, [off]
   164                                  	sys	_write, 1, name, esi
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 000000B0 BB01000000          <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69 000000B5 B9[98010000]        <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71 000000BA 89F2                <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 000000BC B804000000          <1>  mov eax, %1
    76 000000C1 CD30                <1>  int 30h
   165                                  exit:
   166                                  	sys	_exit
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67                              <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69                              <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71                              <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 000000C3 B801000000          <1>  mov eax, %1
    76 000000C8 CD30                <1>  int 30h
   167                                  ;hang:
   168                                  ;	nop
   169                                  ;	jmp	short hang
   170                                  
   171                                  ;ckroot() {
   172                                  ;	int i, n;
   173                                  ;
   174                                  ;	if((n = stat(y.name,&x)) < 0) prname();
   175                                  ;	i = x.devn;
   176                                  ;	if((n = chdir(root)) < 0) prname();
   177                                  ;	if((file = open(root,0)) < 0) prname();
   178                                  ;loop:
   179                                  ;	if((n = read(file,&y,16)) < 16) prname();
   180                                  ;	if(y.jnum == 0) goto loop;
   181                                  ;	if((n = stat(y.name,&x)) < 0) prname();
   182                                  ;	if(x.devn != i) goto loop;
   183                                  ;	x.i[0] =& 060000;
   184                                  ;	if(x.i[0] != 040000) goto loop;
   185                                  ;	cat();
   186                                  ;	prname();
   187                                  
   188                                  	; 06/05/2022
   189                                  	; Note: For Retro UNIX 386 v1 & v1.1 & v1.2,
   190                                  	;	mounted device is handled via 'mnti'
   191                                  	;	field which keeps (device 0) mounting
   192                                  	;	directory inode number for mounted
   193                                  	;	device (1). Device number (0 or 1) check
   194                                  	;	(via 'sysstat') is not possible
   195                                  	;	for current Retro UNIX kernel versions
   196                                  	;	because 'sysstat' output does not contain
   197                                  	;	device number.
   198                                  	;	***
   199                                  	;	As a temporary solution (before a next
   200                                  	;	kernel version with new 'sysstat'),
   201                                  	;	root dir entries are checked for a subdir 
   202                                  	;	('usr' & 'mnt' dirs for now) with root dir
   203                                  	;	inode number (41 or 1), if there is..
   204                                  	;	root directory is a real (device 0) root
   205                                  	;	directory; if not, device 1 root directory 
   206                                  	;	is mounted to a sub directory of device 0.
   207                                  	; 	(Also it must be verified after 'chdir /')
   208                                  	;
   209                                  	;	assumptions...
   210                                  	;	a sub dir with root inode number	
   211                                  	;	dotdot / - chdir /
   212                                  	;	   no    -  no ----> root
   213                                  	;	   yes 	 - (yes) --> root, not checked
   214                                  	;	   no    - yes ----> mounted
   215                                  	;	   yes   - (no) ---> root, not checked				  
   216                                  
   217                                  ckroot:
   218                                  	; 06/05/2022
   219                                  	; check 'usr' directory
   220 000000CA BA[90010000]            	mov	edx, usr
   221 000000CF E846000000              	call	statm 
   222 000000D4 743F                    	jz	short ckroot_2	; root dir
   223                                  	; check 'mnt' directory
   224 000000D6 BA[94010000]            	mov	edx, mnt
   225 000000DB E83A000000              	call	statm 
   226 000000E0 7433                    	jz	short ckroot_2	; root dir
   227                                  
   228                                  	sys	_chdir, root
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 000000E2 BB[8E010000]        <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69                              <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71                              <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 000000E7 B80C000000          <1>  mov eax, %1
    76 000000EC CD30                <1>  int 30h
   229 000000EE 7225                    	jc	short ckroot_2	; jmp short prname
   230                                  
   231                                  	; check 'usr' directory
   232 000000F0 BA[90010000]            	mov	edx, usr
   233 000000F5 E820000000              	call	statm 
   234 000000FA 740C                    	jz	short ckroot_1	; mounted
   235                                  	; check 'mnt' directory
   236 000000FC BA[94010000]            	mov	edx, mnt
   237 00000101 E814000000              	call	statm 
   238 00000106 750D                    	jnz	short ckroot_2	; not mounted
   239                                  
   240                                  	; mounted
   241                                  ckroot_1:
   242                                  	; move mounting directory name
   243 00000108 89D6                    	mov	esi, edx
   244 0000010A BF[C4030000]            	mov	edi, yname
   245 0000010F A5                      	movsd
   246                                  	; concatenate (add to head of the path)
   247 00000110 E81E000000              	call	cat
   248                                  ckroot_2:
   249 00000115 E96FFFFFFF              	jmp	prname
   250                                  
   251                                  statm:
   252                                  	; 06/05/2022
   253                                  	sys	_stat, edx, _x
    63                              <1> 
    64                              <1> 
    65                              <1> 
    66                              <1>  %if %0 >= 2
    67 0000011A 89D3                <1>  mov ebx, %2
    68                              <1>  %if %0 >= 3
    69 0000011C B9[A0030000]        <1>  mov ecx, %3
    70                              <1>  %if %0 = 4
    71                              <1>  mov edx, %4
    72                              <1>  %endif
    73                              <1>  %endif
    74                              <1>  %endif
    75 00000121 B812000000          <1>  mov eax, %1
    76 00000126 CD30                <1>  int 30h
   254 00000128 7208                    	jc	short statm_1
   255                                  	;cmp	word [inum], 1	; Retro UNIX 386 v1.2
   256 0000012A 66833D[A0030000]29      	cmp	word [inum], 41 ; root dir inode number
   257                                  statm_1:
   258 00000132 C3                      	retn
   259                                  
   260                                  ;cat() {
   261                                  ;	int i, j;
   262                                  ;
   263                                  ;	i = -1;
   264                                  ;	while(y.name[++i] != 0);
   265                                  ;	if((off+i+2) > 511) prname();
   266                                  ;	for(j=off+1; j>=0; --j) name[j+i+1] = name[j];
   267                                  ;	off=i+off+1;
   268                                  ;	name[i] = root[0];
   269                                  ;	for(--i; i>=0; --i) name[i] = y.name[i];
   270                                  ;}
   271                                  
   272                                  cat:
   273 00000133 31DB                    	xor	ebx, ebx
   274 00000135 4B                      	dec	ebx ; i = -1
   275                                  cat_0:
   276 00000136 43                      	inc	ebx ; ++i
   277 00000137 80BB[C4030000]00        	cmp	byte [yname+ebx], 0
   278 0000013E 77F6                    	ja	short cat_0
   279 00000140 89DA                    	mov	edx, ebx ; i
   280 00000142 8B0D[9C030000]          	mov	ecx, [off]
   281 00000148 41                      	inc	ecx ; j = [off]+1
   282 00000149 01CA                    	add	edx, ecx  ; edx = [off]+i+1
   283 0000014B 81FAFD010000            	cmp	edx, 511-2 ; (+ CRLF + 0) 
   284                                  	;ja	short prname
   285 00000151 77C2                    	ja	short ckroot_2 ; jmp prname
   286 00000153 BE[98010000]            	mov	esi, name
   287 00000158 01CE                    	add	esi, ecx ; name[j]
   288 0000015A 89F7                    	mov	edi, esi
   289 0000015C 01DF                    	add	edi, ebx ; name[j+i]
   290 0000015E 47                      	inc	edi ; name[j+i+1]	
   291                                  cat_1:
   292                                  	;std
   293                                  	;rep	stosb
   294                                  	;cld
   295 0000015F 49                      	dec	ecx
   296 00000160 7808                    	js	short cat_2
   297 00000162 4E                      	dec	esi
   298 00000163 8A06                    	mov	al, [esi]
   299 00000165 4F                      	dec	edi
   300 00000166 8807                    	mov	[edi], al
   301 00000168 EBF5                    	jmp	short cat_1
   302                                  cat_2:
   303 0000016A 8915[9C030000]          	mov	[off], edx ; [off] = i+[off]+1
   304 00000170 C683[98010000]2F        	mov	byte [name+ebx], '/' ; name[i] = root[0]
   305                                  cat_3:
   306 00000177 4B                      	dec	ebx ; --i
   307 00000178 780E                    	js	short cat_4 ; 0 -> -1
   308                                  		 ; name[i] = yname[i]
   309 0000017A 8A83[C4030000]          	mov	al, [yname+ebx]
   310 00000180 8883[98010000]          	mov	[name+ebx], al
   311 00000186 EBEF                    	jmp	short cat_3 ; i >= 0
   312                                  cat_4:
   313 00000188 C3                      	retn
   314                                  
   315                                  ;-----------------------------------------------------------------
   316                                  ;  data - initialized data
   317                                  ;-----------------------------------------------------------------
   318                                  
   319                                  ; 05/05/2022
   320                                  
   321 00000189 2E                      dotdot:	db '.'
   322 0000018A 2E                      dot:	db '.'
   323 0000018B 00                      	db 0
   324                                  
   325                                  ; 06/05/2022
   326                                  nextline:
   327 0000018C 0D0A                    	db 0Dh, 0Ah
   328 0000018E 2F00                    root:	db '/', 0
   329                                  
   330                                  ; default mounting directories (for current retro unix version)
   331 00000190 75737200                usr:	db 'usr', 0
   332 00000194 6D6E7400                mnt:	db 'mnt', 0
   333                                  
   334                                  ;-----------------------------------------------------------------
   335                                  ;  bss - uninitialized data
   336                                  ;-----------------------------------------------------------------	
   337                                  
   338                                  align 4
   339                                  
   340                                  bss_start:
   341                                  
   342                                  ABSOLUTE bss_start
   343                                  
   344                                  ; 05/05/2022
   345                                  
   346 00000198 <res 200h>              name:	resb 512
   347                                  
   348 00000398 ????????                file:	resd 1
   349 0000039C ????????                off:	resd 1
   350                                  
   351                                  _x:	; stat(us) buffer
   352                                  inum:
   353 000003A0 ????                    	resw 1
   354                                  ximode:
   355                                  	;resb 64 ; Retro UNIX 386 v1.2
   356 000003A2 <res 20h>               	resb 32 ; Retro UNIX 386 v1 & v1.1
   357                                  _y:	; directory entry buffer
   358 000003C2 ????                    jnum:	resw 1
   359                                  yname:	;resb 14 ; Retro UNIX 386 v1.1 & v1.2
   360 000003C4 ????????????????        	resb 8 ; Retro UNIX 386 v1 (unix v1)
   361 000003CC ????                    yzero:	resw 1
   362                                  
   363                                  ; 05/05/2022
   364                                  
   365                                  ;-----------------------------------------------------------------
   366                                  ; Original UNIX v5 - /usr/bin/pwd file - c source code (pwd.c)
   367                                  ;-----------------------------------------------------------------
   368                                  ;
   369                                  ;char dot[] ".";
   370                                  ;char dotdot[] "..";
   371                                  ;char root[] "/";
   372                                  ;char name[512];
   373                                  ;int file, off -1;
   374                                  ;struct statb {int devn, inum, i[18];}x;
   375                                  ;struct entry { int jnum; char name[16];}y;
   376                                  ;
   377                                  ;main() {
   378                                  ;	int n;
   379                                  ;
   380                                  ;loop0:
   381                                  ;	stat(dot, &x);
   382                                  ;	if((file = open(dotdot,0)) < 0) prname();
   383                                  ;loop1:
   384                                  ;	if((n = read(file,&y,16)) < 16) prname();
   385                                  ;	if(y.jnum != x.inum)goto loop1;
   386                                  ;	close(file);
   387                                  ;	if(y.jnum == 1) ckroot();
   388                                  ;	cat();
   389                                  ;	chdir(dotdot);
   390                                  ;	goto loop0;
   391                                  ;}
   392                                  ;ckroot() {
   393                                  ;	int i, n;
   394                                  ;
   395                                  ;	if((n = stat(y.name,&x)) < 0) prname();
   396                                  ;	i = x.devn;
   397                                  ;	if((n = chdir(root)) < 0) prname();
   398                                  ;	if((file = open(root,0)) < 0) prname();
   399                                  ;loop:
   400                                  ;	if((n = read(file,&y,16)) < 16) prname();
   401                                  ;	if(y.jnum == 0) goto loop;
   402                                  ;	if((n = stat(y.name,&x)) < 0) prname();
   403                                  ;	if(x.devn != i) goto loop;
   404                                  ;	x.i[0] =& 060000;
   405                                  ;	if(x.i[0] != 040000) goto loop;
   406                                  ;	cat();
   407                                  ;	prname();
   408                                  ;}
   409                                  ;prname() {
   410                                  ;	name[off] = '\n';
   411                                  ;	write(1,name,off+1);
   412                                  ;	exit();
   413                                  ;}
   414                                  ;cat() {
   415                                  ;	int i, j;
   416                                  ;
   417                                  ;	i = -1;
   418                                  ;	while(y.name[++i] != 0);
   419                                  ;	if((off+i+2) > 511) prname();
   420                                  ;	for(j=off+1; j>=0; --j) name[j+i+1] = name[j];
   421                                  ;	off=i+off+1;
   422                                  ;	name[i] = root[0];
   423                                  ;	for(--i; i>=0; --i) name[i] = y.name[i];
   424                                  ;}
